我有一个抽象方法 checkStatus()
,它在 Checker.java 类中具有实现。但是,当我在抽象类方法 validate()
上执行 Junit 测试用例并依次调用 checkStatus()
时,由于 Checker.java 类中缺少 spring 依赖而失败。
详细信息如下。
抽象类:
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);
}
}
我相信我可以像下面这样手动注入(inject)辅助对象
Checker check = mock(Checker.class);
StatusHelper helper = mock(StatusHelper.class);
check.setHelper(helper);
但这里的问题是,我无法直接注入(inject) absClass
对象,因为 setHelper()
不是继承的。
我可以直接将测试用例写入子类,但我需要这种方式来测试抽象类的 validate()
方法中的一些其他功能。
有人可以帮助我如何将辅助对象设置为子类,或者在 Junit 中有不同的方法吗?任何包含相关信息的帮助或链接都非常值得赞赏。 谢谢,
最佳答案
测试抽象类的唯一方法是测试实现(可能是匿名类)。
public class AbstractClassTest {
@Test
public void testStatusOfChecker() throws Exception {
MyAbstractClass object = new MyAbstractClass() {
protected boolean checkStatus() {
return true; //this is the place to provide the expected value
}
}
boolean status = absClass.validate();
assertEquals(status, true);
}
}
如果您想测试 Checker
实现,那么您不能模拟它。
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);
}
}
顺便说一句,我强烈建议使用构造函数注入(inject)(请参阅 Why field injection is evil )。测试将如下所示
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);
}
}
关于java - Junit 测试用例因抽象方法而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30033427/