gpt4 book ai didi

java - 使用 Spring Boot 和 Mockito 模拟对象方法调用

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:19:31 25 4
gpt4 key购买 nike

我正在尝试为这个 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 注释进行注释,以使用 @ 将其注入(inject)其他类 Autowiring

最佳答案

经过反复试验,我设法解决了这个问题。

我放弃了

@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...
}
}

我不确定这是否是最好的方法(“Spring 方式”),但这对我有用。

这篇文章让我明白了:http://rdafbn.blogspot.be/2014/01/testing-spring-components-with-mockito.html

关于java - 使用 Spring Boot 和 Mockito 模拟对象方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32820546/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com