![](/img/trans.png)
[英]How to mock Asynchronous (@Async) method in Spring Boot using Mockito?
[英]Mock object method call using Spring Boot and Mockito
我正在嘗試為這個Java SpringBoot類編寫一個測試:
具體來說,我試圖“模擬”這個方法調用:
URI uri = util.getServiceUrl("product");
我想我應該“模擬” ServiceUtils
對象才能做到這一點。 我使用@Mock
和@InjectMocks
注釋嘗試了這個:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = ProductCompositeServiceApplication.class)
public class ProductCompositeIntegrationTest {
@InjectMocks
@Autowired
private ProductCompositeIntegration productIntegration;
@Autowired
private RestTemplate restTemplate;
@Mock
private ServiceUtils util;
private MockRestServiceServer mockServer;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mockServer = MockRestServiceServer.createServer(restTemplate);
}
@Test
public void myTest() {
Mockito.when(util.getServiceUrl("product")).thenReturn(URI.create("http://localhost:8080/test"));
ResponseEntity<Iterable<Product>> products = productIntegration.getAllProducts();
}
}
但是這樣它仍然調用原始的ServiceUtils
對象,而不是“模擬”對象。 也沒有在ProductCompositeIntegration
使用@Autowired
注釋嘗試,但這會導致NullPointerException
。
我究竟做錯了什么?
我的主要課程如下:
@SpringBootApplication
@EnableCircuitBreaker
@EnableDiscoveryClient
public class ProductCompositeServiceApplication {
public static void main(String[] args) {
SpringApplication.run(ProductCompositeServiceApplication.class, args);
}
}
我試圖模擬的ServiceUtils
對象在類中指定,使用Spring的@Component
注釋注釋,使用@Autowired
將其注入其他類。
經過大量的反復試驗,我設法解決了這個問題。
我放棄了
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = ProductCompositeServiceApplication.class)
注釋高於測試類。
我用@InjectMocks
和@Mock
的依賴項標記了我正在測試的類:
public class ProductCompositeIntegrationTest {
@InjectMocks
private ProductCompositeIntegration productIntegration;
@Mock
private ServiceUtils util;
private MockRestServiceServer mockServer;
private RestTemplate restTemplate = new RestTemplate();
@Before
public void init() {
MockitoAnnotations.initMocks(this);
mockServer = MockRestServiceServer.createServer(restTemplate);
productIntegration.setRestTemplate(restTemplate);
}
@Test
public void someTests() {
when(util.getServiceUrl("product")).thenReturn(URI.create("http://localhost:8080/test"));
//Test code...
}
}
我不確定這是否是最好的方法(“春天的方式”),但這對我有用。
這篇文章讓我很清楚: http : //rdafbn.blogspot.be/2014/01/testing-spring-components-with-mockito.html
你必須寫一個像FactoryBean
public class MockitoFactoryBean<T> implements FactoryBean<T> {
private Class<T> classToBeMocked;
public MockitoFactoryBean(Class<T> classToBeMocked) {
this.classToBeMocked = classToBeMocked;
}
@Override
public T getObject() throws Exception {
return Mockito.mock(classToBeMocked);
}
@Override
public Class<?> getObjectType() {
return classToBeMocked;
}
@Override
public boolean isSingleton() {
return true;
}
}
在test-context.xml
您必須添加以下行。
<bean id="serviceUtilMock" class="MockitoFactoryBean">
<constructor-arg value="your.package.ServiceUtil" />
</bean>
如果不使用XML配置,則必須在Java配置中添加上述等效項。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.