Mam do czynienia z problemami przedrzeźniającymi usługi wstrzyknięte w ramach innych usług w ramach struktury Spring. Tu jest mój kodu:Usługi symulacyjne w ramach innej usługi wiosennej z użyciem mockito
@Service("productService")
public class ProductServiceImpl implements ProductService {
@Autowired
private ClientService clientService;
public void doSomething(Long clientId) {
Client client = clientService.getById(clientId);
// do something
}
}
Chcę mock ClientService
wewnątrz mojego testu, więc próbowałem następujące:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:/spring-config.xml" })
public class ProductServiceTest {
@Autowired
private ProductService productService;
@Mock
private ClientService clientService;
@Test
public void testDoSomething() throws Exception {
when(clientService.getById(anyLong()))
.thenReturn(this.generateClient());
/* when I call this method, I want the clientService
* inside productService to be the mock that one I mocked
* in this test, but instead, it is injecting the Spring
* proxy version of clientService, not my mock.. :(
*/
productService.doSomething(new Long(1));
}
@Before
public void beforeTests() throws Exception {
MockitoAnnotations.initMocks(this);
}
private Client generateClient() {
Client client = new Client();
client.setName("Foo");
return client;
}
}
clientService
wewnątrz productService
jest wersja Wiosna proxy, a nie makiety że chcieć. Czy można robić to, co chcę z Mockito?
Dzięki, próbowałem to rozwiązanie i działało w porządku, ale nie mogę zmienić wstrzyknięciem setter w tej usługi, więc moje rozwiązanie było usuń automatycznie zaznaczoną adnotację na moich testach i utwórz usługę ręcznie, jak na przykład: '@InjectMocks private ProductService productService = new ProductServiceImpl();' – br4zuca
@ br4zuca możesz to zrobić za pomocą '@InjectMocks private ProductService productService', nie init to ręczne, niech makiety ito to zrób. – Jaiwo99
Próbowałem zostawić init mockito 'productService' z' @ InjectMocks', ale nie zadziałało, ponieważ 'ProductService' to interfejs, który rzucił:' org.mockito.exceptions.base.MockitoException: typ 'ProductService' to interfejs ", więc nie był w stanie utworzyć instancji. – br4zuca