0

我正在TestNG与我的测试课程一起使用Mockito。我试图创建一个spy对象并用来ArgumentMatchers存根方法调用。在使用参数匹配器时,Mockito 指出要匹配原始类型,我们需要使用anyLong(),或类似的东西anyInt()anyChar()具体取决于所需的参数类型。所以在这种情况下,如果我们使用any()then 会导致NullPointerException.

我尝试了三种方法:

  1. NPE会被抛出,因为我曾经any()匹配一个原始参数
  2. NPE会被抛出,因为我用过throw new NullPointerException()
  3. 没有抛出异常。

以下是我使用的代码。(我用过static imports方法Mockito

@Test
public class MyTest {
    class Something {
        public int someMethod(long someLong, int someInt, Set<Long> someSet) {
            return 1;
        }
    }

    @Test
    public void testOne() {
        Something s = spy(new Something());
        doReturn(5).when(s).someMethod(any(), any(), any()); // NPE
    }

    @Test
    public void testTwo(){
        Something s = spy(new Something());
        if(0==0) {
            throw new NullPointerException();
        }

        doReturn(5).when(s).someMethod(anyLong(), any(Integer.class), any());
    }

    @Test
    public void testThree() {
        Something s = spy(new Something());
        doReturn(5).when(s).someMethod(anyLong(), any(Integer.class), any()); // no issues
    }
}

观察:

  1. 如果我运行整个班级,那么所有方法都会失败。testThree投掷InvalidUseOfMatchersException
  2. 如果我单独运行第三种方法,那么它将通过。
  3. 如果我评论testOne然后运行整个运行类,那么testTwo将失败并testThree通过。

在我上面的观察中,2 和 3 符合预期。但我不明白为什么testThree观察1也失败了。当我检查控制台时,它表明

如果最后一个匹配器我们返回像 any() 这样的对象,但存根方法签名需要一个原始参数,则此消息可能出现在 NullPointerException 之后。

所以我的问题是为什么一个测试方法会因为以前的测试方法的问题而失败?

(另外,如果我重命名testOnetestZZ使其按字母顺序最后执行,那么testThree在类级别测试运行时将通过。)

4

0 回答 0