我正在尝试为一个类添加单元测试,我需要模拟(和注入)一个依赖到一个类中,而不对测试中的类进行更改(因为这将导致我们希望避免的应用程序其他部分的大量更改)。
我手动创建了这个类(没有使用@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());
}
}
1条答案
按热度按时间y1aodyip1#
如果您不能使用
@InjectMocks
,也不能更改类使其更易于测试,那么您只能使用Reflection:1.查找字段
1.使其可访问
1.将您的模拟分配给字段
如果您已经在使用Spring,那么
ReflectionUtils#setField
可能会派上用场。