抽象方法的 Junit 测试用例失败
Junit test cases fail for abstract method
我有一个抽象方法 checkStatus()
,它在 Checker.java class 中有实现。但是,当我在抽象 class 方法 validate()
上执行 Junit 测试用例时,该方法又调用 checkStatus()
,由于 Checker.java 中缺少 spring 依赖关系而失败 class.
详情如下。
摘要class:
public abstract class MyAbstractClass
{
protected abstract boolean checkStatus();
public boolean validate()
{
//Some code
return checkStatus();
}
}
实施class:
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);
}
}
我相信我可以像下面这样手动注入辅助对象
Checker check = mock(Checker.class);
StatusHelper helper = mock(StatusHelper.class);
check.setHelper(helper);
但这里的问题是,我不能直接注入到 absClass
对象,因为 setHelper()
不是继承的。
我可以直接将测试用例写到 subclass,但我需要这种方法来测试抽象 class.
的 validate()
方法中的一些其他功能
有人可以帮助我如何将辅助对象设置为子 class 或者在 Junit 中有不同的方法吗?非常感谢包含相关信息的任何帮助或链接。
谢谢,
测试抽象 class 的唯一方法是测试实现(可以是匿名 class)。
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);
}
}
顺便说一句,我强烈建议使用构造函数注入(参见 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);
}
}
我有一个抽象方法 checkStatus()
,它在 Checker.java class 中有实现。但是,当我在抽象 class 方法 validate()
上执行 Junit 测试用例时,该方法又调用 checkStatus()
,由于 Checker.java 中缺少 spring 依赖关系而失败 class.
详情如下。
摘要class:
public abstract class MyAbstractClass
{
protected abstract boolean checkStatus();
public boolean validate()
{
//Some code
return checkStatus();
}
}
实施class:
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);
}
}
我相信我可以像下面这样手动注入辅助对象
Checker check = mock(Checker.class);
StatusHelper helper = mock(StatusHelper.class);
check.setHelper(helper);
但这里的问题是,我不能直接注入到 absClass
对象,因为 setHelper()
不是继承的。
我可以直接将测试用例写到 subclass,但我需要这种方法来测试抽象 class.
的validate()
方法中的一些其他功能
有人可以帮助我如何将辅助对象设置为子 class 或者在 Junit 中有不同的方法吗?非常感谢包含相关信息的任何帮助或链接。 谢谢,
测试抽象 class 的唯一方法是测试实现(可以是匿名 class)。
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);
}
}
顺便说一句,我强烈建议使用构造函数注入(参见 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);
}
}