簡體   English   中英

使用Spring Boot和Mockito進行模擬對象方法調用

[英]Mock object method call using Spring Boot and Mockito

我正在嘗試為這個Java SpringBoot類編寫一個測試:

https://github.com/callistaenterprise/blog-microservices/blob/master/microservices/composite/product-composite-service/src/main/java/se/callista/microservices/composite/product/service/ProductCompositeIntegration.java

具體來說,我試圖“模擬”這個方法調用:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM