java - Junit 测试用例因抽象方法而失败

标签 java spring junit mockito

我有一个抽象方法 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/

相关文章:

java - 将日期字符串转换为 UTC

java - 不使用带有 Autowire 的构造函数的模拟服务

java - 如何为 Spring Boot 应用程序编写 Junit 测试用例?

java - Java中单个字符大写

java - 如何将字符串值作为json对象存储在mongodb中?

java - 在 Spring 拦截器中访问 DWR 发布数据

java - Junit 正面和负面测试

java - Tomcat7 启动时间过长

java - LibGDX 从核心模块 (MyGdxGame) 中的 android 模块 (AndroidLauncher) 获取变量?

spring - 如何使用 Spring EventListener 进行 sendAndReceive ?