Java 抽象方法的Junit测试用例失败
我有一个抽象方法Java 抽象方法的Junit测试用例失败,java,spring,junit,mockito,Java,Spring,Junit,Mockito,我有一个抽象方法checkStatus(),它在Checker.java类中有实现。但是,当我在抽象类方法validate()上执行Junit测试用例时,由于Checker.java类中缺少spring依赖关系,该方法反过来调用checkStatus(),因此失败 详情如下 抽象类: public abstract class MyAbstractClass { protected abstract boolean checkStatus(); public boolean v
checkStatus()
,它在Checker.java类中有实现。但是,当我在抽象类方法validate()
上执行Junit测试用例时,由于Checker.java类中缺少spring依赖关系,该方法反过来调用checkStatus()
,因此失败
详情如下
抽象类:
public abstract class MyAbstractClass
{
protected abstract boolean checkStatus();
public boolean validate()
{
//Some code
return checkStatus();
}
}
实现类:
public class Checker extends MyAbstractClass
{
@Autowired
private StatusHelper helper;
public void setHelper(StatusHelper helper){
this.helper = helper;
}
@Override
public boolean checkStatus() throws Exception{
if(null == helper){
throw new Exception("Helper is null");
}
return helper.validateStatus();
}
}
JUnit测试:
class AbstractClassTest
{
MyAbstractClass absClass = Mockito.mock(Checker.class, Mockito.CALLS_REAL_METHODS);
@Test
public void testStatusOfChecker()throws Exception {
boolean status = absClass.validate();
assertEquals(status, true);
}
}
我相信我可以像下面这样手动注入helper对象
Checker check = mock(Checker.class);
StatusHelper helper = mock(StatusHelper.class);
check.setHelper(helper);
但是这里的问题是,我不能直接注入absClass
对象,因为setHelper()
不是继承的
我可以直接将测试用例编写到子类,但我需要用这种方法来测试抽象类的validate()
方法中的一些其他功能
有人能帮助我如何将helper对象设置为子类吗?或者在Junit中有不同的方法吗?任何包含相关信息的帮助或链接都是非常值得欣赏的。
谢谢,测试抽象类的唯一方法是测试实现(可能是匿名类) 如果要测试
检查器
实现,则不能对其进行模拟
public class CheckerTest {
@Test
public void test() {
StatusHelper helper = mock(StatusHelper.class);
Checker checker = new Checker();
checker.setHelper(helper);
when(helper.validate()).thenReturn(true);
boolean status = checker.validate();
assertEquals(status, true);
}
}
顺便提一下,我强烈建议使用构造函数注入(请参阅)。测试结果将是这样的
public class CheckerTest {
@Test
public void test() {
StatusHelper helper = mock(StatusHelper.class);
Checker checker = new Checker(helper);
when(helper.validate()).thenReturn(true);
boolean status = checker.validate();
assertEquals(status, true);
}
}
public class CheckerTest {
@Test
public void test() {
StatusHelper helper = mock(StatusHelper.class);
Checker checker = new Checker(helper);
when(helper.validate()).thenReturn(true);
boolean status = checker.validate();
assertEquals(status, true);
}
}