Java Junit用于循环执行计数
我需要运行给定次数的代码。我想知道如何对这个循环进行单元测试Java Junit用于循环执行计数,java,junit,junit4,Java,Junit,Junit4,我需要运行给定次数的代码。我想知道如何对这个循环进行单元测试 public void executeCode(int iterations){ for (int i = 0; i < iterations; i++) try { callToCode(parms...); } catch(Exception e) { // handle exception i--; } } pu
public void executeCode(int iterations){
for (int i = 0; i < iterations; i++)
try {
callToCode(parms...);
} catch(Exception e) {
// handle exception
i--;
}
}
public void executeCode(int迭代){
对于(int i=0;i
callToCode此方法具有100%的行覆盖率,但它的一个要求是在给定的迭代次数下执行此方法
我可以使用实例变量来跟踪执行,但对这种循环进行单元测试的最佳方法是什么
我只能使用Junit而不能使用其他库如果可以,重构代码以将依赖项调用建模为对注入成员的调用
public void executeCode(int iterations, Callable callable) {
for (int i = 0; i < iterations; i++)
try {
callable.call();
} catch(Exception e) {
// handle exception
i--;
}
然后再次在JUnit中,您可以注入一个计算调用的不同类
最后,如果调用代码(parms…);是类中的另一个方法,也可以重写它以计数,如下所示:
public class MyClassTest {
@Test
public void testCountLoop() {
MyClass class = new MyClass() {
int calls;
@Override
public void callToCode(parms...) {
calls++;
}
}
// ... run and assert calls
}
}
我会将callToCode提取到另一个类,如
public class Caller{
public void callToCode(String someparam){//Some logic}
}
然后,您的循环将位于另一个类中,在构造函数中具有依赖项:
public class OuterClass {
Caller caller;
public OuterClass(Caller caller){
this.caller = caller;
}
public void executeCode(int iterations){
for (int i = 0; i < iterations; i++)
try {
caller.callToCode(parms...);
} catch(Exception e) {
// handle exception
i--;
}
}
}
使用ArgumentCaptor,您还可以验证方法调用的参数。大多数情况下,如果您不能正确地对代码进行单元测试,这是一个设计问题。通过分离代码的不同抽象级别,您可以分别测试每个级别,您将获得更清晰、可读的解决方案。使用Mockito并检查是否调用了该方法。Mockito允许您测试行为,JUnit允许您测试状态。我应该提到,在问题中,很明显,当你在异常中减少
I
时,你的方法总是在给定的迭代次数下成功执行。但这可能需要无限长的时间。“处理异常”是否有需要JUnit覆盖的代码?如果可以使用JUnit 5,参数化测试可以做到这一点:
public class OuterClass {
Caller caller;
public OuterClass(Caller caller){
this.caller = caller;
}
public void executeCode(int iterations){
for (int i = 0; i < iterations; i++)
try {
caller.callToCode(parms...);
} catch(Exception e) {
// handle exception
i--;
}
}
}
public class Test{
OuterClass target = ...
Caller mockeCaller = Mockito.mock(Caller.class);
@Test
public void test(){
Mockito.verify(mockCaller, Mockito.times(2)).callToCode(Mockito.any());
}
}