多个测试文件和MockRestServiceServer,期望来自其他测试文件的调用

时间:2019-06-26 08:04:43

标签: spring spring-boot junit4 resttemplate mockrestserviceserver

我已经构建了具有两个端点的服务,并且我希望通过集成测试涵盖这两个端点。为了防止这些集成测试到达其他服务,我使用MockRestServiceServer类来模拟对其他HTTP服务的调用和响应。

TestOperationA:

@RunWith(SpringRunner.class)
@SpringBootTest
@ActiveProfiles({"integration"})
@ComponentScan(basePackages = "nl.xyz")
public class OperationAIntegrationTest {

    MockRestServiceServer mockServer;
    @Autowired
    RestTemplate restTemplate;

    @Autowired
    OperationA operationA;

    @Before
    public void setup() {
        this.mockServer = MockRestServiceServer.bindTo(restTemplate).bufferContent().ignoreExpectOrder(true).build();
        this.mockServer.reset();
    }

    @After
    public void finish() {
        // Verify all method calls are run after the testcase.
        this.mockServer.verify();
        this.mockServer.reset();
    }

然后,测试用例包含如下内容:

this.mockServer.expect(requestTo(ENDPOINT_OAUTH))
            .andExpect(method(HttpMethod.POST))
            .andRespond(withSuccess(objectMapper.writeValueAsString(oAuthToken), MediaType.APPLICATION_JSON));

我对OperationBIntegrationTest做同样的事情。这包括绑定到restTemplate

现在的问题是,如果我分别运行所有测试用例,那么一切都会成功。如果我从OperationA或OperationB运行所有测试用例,那么它们都将成功。但是,当我运行所有测试用例,以便按顺序执行来自OperationA和OperationB的集成测试时,来自OperationB的测试用例将失败。即使我看到当测试框架跳转到第二个测试文件时,Spring Boot重新开始。

我认为MockRestServiceServer不会被清除,或者与RestTemplate的绑定发生了错误。我通过将.reset().verify()组合放在@Before@After中来进行尝试,但没有任何效果。有人知道为什么会这样吗?

1 个答案:

答案 0 :(得分:0)

很显然,后台发生了一些事情,导致某些变量和方法不再更新,因为先前的测试已经对其进行了更新。当我不弄脏应用程序上下文时(例如,通过添加更多的MockBean),一切都会好起来的。

因此应该将在后台调整值的标记为肮脏。