问题说明:我试图模拟一个使用application.properties文件中的属性的方法。当控件到达要加载属性值的行时,它显示null,因此mockito抛出java.lang.NullPointerException
。
我正在寻找的是当模拟一个方法时,如何从application.properties文件加载属性。这里我正在尝试加载全局变量partslistglobal
。请帮助我如何实现这一点。?
下面是我的代码片段。
@Service
public class ClimoDiagnosticReportServImpl implements ClimoDiagnosticReportService {
@Value("${PARTS_LIST}")
private String partsListGlobal;
@Override
public boolean getSomeResult() {
String[] partsListLocal = getPartsList();
List<String> partsList = Arrays.asList(partsListGlobal);
if (partsList.contains("PART_X1"))
return true;
else
return false;
}
public String[] getPartsList() {
return partsListGlobal.split(",");// Here is the error occuring due to partsListGlobal is not loading the value from application.properties file.
}
}
@RunWith(MockitoJUnitRunner.class)
public class ClimoDiagnosticReportServImplTest {
@InjectMocks
private ClimoDiagnosticReportServImpl serviceReference1;
@Mock
private ClimoDiagnosticReportServImpl serviceReference12;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
}
@Test
public void getSomeResultTest() {
boolean result1 = false;
String[] strArray = new String[2];
strArray[0] = "P1";
strArray[1] = "P2";
Mockito.when(serviceReference12.getPartsList()).thenReturn(strArray);
boolean result2 = serviceReference1.getSomeResult();
Assert.assertEquals(result1,result2);
}
}
提前感谢大家。
您在服务中没有任何要模拟的依赖项。因此,莫基托是完全不必要的。您需要做的是设置私有字符串字段,该字段由Spring使用Reflection在应用程序中填充。
只需遵循使用cnstructor注入而不是字段注入的最佳实践os,这将使您的代码可测试(这也是为什么它是最佳实践的原因之一):
@Service
public class ClimoDiagnosticReportServImpl implements ClimoDiagnosticReportService {
private String partsListGlobal;
public ClimoDiagnosticReportServImpl(@Value("${PARTS_LIST}") String partsListGlobal) {
this.partsListGlobal = partsListGlobal;
}
// ...
}
您的测试现在可以简化为
public class ClimoDiagnosticReportServImplTest {
@Test
public void shouldReturnTrueIfPropertyContainsPartX1() {
ClimoDiagnosticReportServImpl service = new ClimoDiagnosticReportServImpl("a,b,c,PART_X1,d");
assertTrue(service.getSomeResult());
}
@Test
public void shouldReturnFalseIfPropertyDoesNotContainPartX1() {
ClimoDiagnosticReportServImpl service = new ClimoDiagnosticReportServImpl("a,b,c,d");
assertFalse(service.getSomeResult());
}
}
我从单元测试开始。我对一个类做了更改,在这个类中我不注入SessionContext,这样我就可以在需要时进行查找。 现在,在我的测试中,我想注入它,这样我就可以模拟查找方法: 我觉得很奇怪,因为我拥有所需的所有依赖项(这段代码在真实的应用程序中工作)。 如何使用mockito模拟和注入SessionContext?(我无法改变嘲讽框架)。
org.mockito.exceptions.misusing.wurntypeofreturnvalue:OperationContext不能由gethtPrequestTelemetry()返回,如果您不确定为什么会超过错误读取,那么gethtPrequestTelemetry()应该返回RequestTelemetry***。由于语法的性质,上面的问题可能会发生,因为: 此异常可能发生在错误
使用mockito模拟一个方法会确保永远不会调用被模拟的方法吗?我有一个主类,它包含一些我想为其编写单元测试的代码,还有一个单元测试类MainTest,它包含主类的单元测试。 eg: 源类: JUnit测试(使用mockito) 这项测试失败了。为什么?
嗨,我试图使用strut得到一个bean到我的jsp代码,我在我的jsp页面中使用的bean是:但是每当我运行jsp时,我就会收到 bean的“unitForm”的属性“testData.team.type”没有getter方法。 我正在尝试将棒球写入我的JSP页面。 我的行动表单的代码是: 测试数据类具有: 最后在我的体育课上:
我正在为一个系统建模,该系统有一个创建资源的操作和其他消耗该资源的操作。然而,一个给定的资源只能被消耗一次——有没有一种方法可以保证在编译时这样做? 具体来说,假设第一个操作烘焙蛋糕,还有另外两个操作,一个用于“选择吃”蛋糕,另一个用于“选择吃蛋糕”,我只能做其中一个。 通过在我们使用蛋糕后在蛋糕上设置一个标志,很容易在运行时强制执行不保留已经吃过的蛋糕(反之亦然)的限制。但是有没有办法在编译时强