Search code examples
javaspring-bootjunitspring-boot-testspy

How to redefine spybean per test?


I've got a SpringBootTest with a spyBean:

@SpyBean
private MyProperties myProperties;

I'd like to test the behaviour of the component under test with different values within myProperties. I have noticed, however, that when I change the values of myProperties in a single test, the next tests get the value set in the previous test and when I try to reset the value:

@BeforeEach
void setUp() {
   myProperties = new MyProperties();
}

The subsequent change in individual test has no effect.


Solution

  • @MockBean or @SpyBean mocks/spies on instance created by spring context and spring context is cached when running multiple integration tests. One way to fix this is to add @DirtiesContext on next test but this is not recommended as it will slow down your tests. Other solution could be to inject myProperties using ReflectionTestUtils in next test like this

    @BeforeEach
    void setUp() {
        myProperties = new MyProperties();
        ReflectionTestUtils.setField(classInstance,"myProperties", myProperties);
    }