如何在@postconstruct之前配置@mockbean?

nbysray5  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(732)

我有一项服务 DataProvider 我想嘲笑一下。
问题:服务使用中的数据提供程序 @PostConstruct . 但当我使用 @MockBean 中不存在模拟值 @PostConstruct .
我能做什么?

@Service
public class MyService {
    private List<Object> data;

    @Autowired
    private DataProvider dataProvider;

    @PostConstruct
    public void initData() {
        data = dataProvider.getData();
    }

    public void run() {
        System.out.println(data); //always null in tests
    }
}

@SpringBootTest
public class Test {
    @MockBean
    private DataProvider dataProvider;

    @Test
    public void test() {
        when(dataProvider.getData()).thenReturn(mockedObjects);
        //dataProvider.init(); //this fixes it, but feels wrong
        service.run();
    }
}
x759pob2

x759pob21#

imho单元测试 MyService 对于这个特定的场景来说,这是一个更好的解决方案(而且我不会觉得打电话是错的) initService 如果你坚持的话。。。
你可以简单地覆盖 DataProvider 为这个特定的测试定义bean并预先模拟它,例如:

@SpringBootTest(classes = {MyApplication.class, Test.TestContext.class})
public class Test {

    @Test
    public void test() {
        service.run();
    }

    @Configuration
    static class TestContext {

        @Primary
        public DataProvider dataProvider() {
            var result = Mockito.mock(DataProvider.class);
            when(result.getData()).thenReturn(mockedObjects);
            return result;
        }
    }
}

您可能需要设置 spring.main.allow-bean-definition-overridingtrue 为上述工作。

相关问题