java - 使用 Mockito 测试抽象类不会给出预期结果

标签 java mockito testng abstract-class

我有一个类似于以下的类结构

 public abstract class AbstractStep {
     private final Range RANGE;

     AbstractStep(AbstractStepBuilder builder) {
          RANGE = builder.range;   
     }


      public abstract static class AbstractStepBuilder {
           Range range;

           public AbstractStepBuilder setRange(int start, end end) {
                this.range = new Range(start, end);
                return self();
           }

           abstract AbstractStepBuilder self();
      }

      public static class Range() {
           private final int START;
           private final int END;

           private Range(int start, int end) {
                if(start < 0 || end < 0 || start >= end)
                      throw new IllegalArgumentException();
                START = start;
                END = end;
           }
      }
 }

我想在 AbstractStepBuilder 中测试 setRange(int, int) 以查看是否抛出 IllegalArgumentException 。我使用 TestNG 和 Mockito,并且在 this 的帮助下尝试了以下使用.

 final class RangeTest {
      AbstractStepBuilder builder;

      @BeforeSuite 
      void setup() {
           builder = Mockito.mock(AbstractStepBuilder.class);
           Mockito.when(builder.self()).thenReturn(null);
       }

     @Test(expectedExceptions = IllegalArgumentException.class)
     final void testCreatingRangeWithNegativeStart() {
          builder.setRange(-1, 2);
     }
}

此测试失败。我还尝试将 Mockito.mock(AbstractStepBuilder.class) 替换为 Mockito.mock(AbstractStepBuilder.class, Mockito.CALLS_REAL_METHODS),如 this 的最佳答案中所示。问题。

请注意,如果我将 CodeRange 作为其自己的外部类,则此测试通过,因此我不相信它可能是测试本身。

为什么此测试失败,是否可以修复它而无需在测试中使用具体类?

最佳答案

您正在模拟上调用一个方法,除非您告诉它,否则它永远不会抛出异常。你永远不会模拟你想要测试的类。

如果您想测试实际的类,您需要创建步骤构建器的子类,创建一个实例并对其进行测试。

我认为您还可以创建一个 spy (通过Mockito.spy(AbstractStepBuilder.class))以避免仅为测试创建子类。

关于java - 使用 Mockito 测试抽象类不会给出预期结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60484713/

相关文章:

Java - 使用 OCR 从 PDF 中提取文本

java - 在 Karaf OSGI 中,我收到抛出异常的包中的类的 ClassNotFoundException

java - jsp中跨选项卡的 session 管理

java - 无法在我的测试中注入(inject) Bean(@Spy 注入(inject) bean 的子级)

java - 将 bean 注入(inject)到使用 mockito 创建的模拟中

java - 在TestNG的单元测试中,使用mokito stub 函数时总是报nullPointerException,我没有找到解决方案

java - 如何在 TestNG 中结合 Mockito 和 Spring

java - 页面对象模型未从类扩展驱动程序

java - 在不同的 chrome 选项卡中运行测试方法

java - com.google.appengine :appengine-api-1. 0-sdk:jar 的“dependency.dependency.version”必须是有效版本,但为 '${appengine.target.version}'