Spring Boot 不使用@InjectMocks的单元测试类

svdrlsy4  于 2022-12-13  发布在  Spring
关注(0)|答案(1)|浏览(183)

我正在尝试为一个类添加单元测试,我需要模拟(和注入)一个依赖到一个类中,而不对测试中的类进行更改(因为这将导致我们希望避免的应用程序其他部分的大量更改)。
我手动创建了这个类(没有使用@InjectMocks),因为我需要在测试中模拟AppConfig
我在系统期望注入依赖项的行上得到一个空指针异常。
我遗漏了什么?我可以做些什么来解决这个问题?

页面模型构建器.java:

public class PageModelBuilder {
    private final String baseUrl = AppConfig.findString("baseUrl");
    @Inject
    private StringTranslator stringTranslator;
    public PageModel buildFrom(final @NonNull ProductData productData) {
        PageModel.PageModelBuilder builder = new PageModel.PageModelBuilder();
        productData.getProductTitle().ifPresent(productTitle -> {
            builder .pageDescription(String.format(stringTranslator.getStringById("page_description_format"),
                            productTitle.getDisplayString())); //<= stringTranslator is null here
        });
        productData.getProductLink()
                .ifPresent(productLink -> builder.canonicalURL(baseUrl + productLink));
        return builder.build();
    }
}

页面模型构建器测试.java:

@RunWith(MockitoJUnitRunner.Silent.class)
    public class PageModelBuilderTest {
        @Mock
        private StringTranslator stringTranslator;
        private PageModelBuilder pageModelBuilder;
        @Before
        public void setup() {
            if (!AppConfig.isInitialized()) {
                AppConfig.initialize("WebApp", null, new String[] {
                        "--root=.", "--domain=test"});
            }
        }
        @After
        public void after() {
            if (AppConfig.isInitialized()) {
                AppConfig.destroy();
            }
        }
        @Test
        public void givenProductDataWithProductLink_whenBuildPageModel_thenPageModelHasCanonicalURL() {
            AppConfig.insertString("baseUrl", "https://www.google.com");
when(stringTranslator.getStringById("page_description_format")).thenReturn("sample description");
            pageModelBuilder = new PageModelBuilder();
            ProductData productData = ProductTestData.getProductDataBuilder()
                    .title("TestMed")
                    .productLink("/PRODUCT-DESCRIPTION/dp/asin")
                    .build();
            PageModel pageModel = pageModelBuilder.buildFrom(productData);
            assertEquals("https://www.google.com/PRODUCT-DESCRIPTION/dp/asin", pageModel.getCanonicalURL());
        }
    }
y1aodyip

y1aodyip1#

如果您不能使用@InjectMocks,也不能更改类使其更易于测试,那么您只能使用Reflection:
1.查找字段
1.使其可访问
1.将您的模拟分配给字段
如果您已经在使用Spring,那么ReflectionUtils#setField可能会派上用场。

相关问题