java - Mockito verify(...) 失败 - "Actually, there were zero interactions with this mock."在多次连续测试中运行

标签 java mockito testng

<分区>

我有一个 Wrapper 类导致在包装对象上调用 equalsWithoutId 方法而不是 equals 方法。此处实现:

import org.apache.commons.lang3.Validate;

public class IdAgnosticWrapper {

    private final IdAgnostic wrapped;

    public IdAgnosticWrapper(IdAgnostic wrapped) {
        Validate.notNull(wrapped, "wrapped must not be null");
        this.wrapped = wrapped;
    }

    @Override
    public int hashCode() {
        return wrapped.hashCodeWithoutId();
    }

    @Override
    public boolean equals(Object obj) {
        if (!(obj instanceof IdAgnosticWrapper)) {
            return false;
        }
        return wrapped.equalsWithoutId(((IdAgnosticWrapper) obj).getWrapped());
    }

    public IdAgnostic getWrapped() {
        return wrapped;
    }
}

IdAgnostic 是一个简单的接口(interface),可确保存在所需的方法

public interface IdAgnostic {
    int hashCodeWithoutId();
    boolean equalsWithoutId(Object o);
}

然后我有一些应该测试的单元测试,如果 equals() 委托(delegate)给 wrapped#equalsWithoutId() 方法并且 hashCode() 委托(delegate)给 wrapped#hashCodeWithoutId。

现在我尝试通过这些测试来测试它

import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

import static org.mockito.Mockito.verify;

public class IdAgnosticWrapperTest {

    @Mock
    private IdAgnostic wrappedMock;

    @InjectMocks
    private IdAgnosticWrapper tested;


    @BeforeMethod
    public void setUp() throws Exception {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void testEquals_EqualsWithoutIdIsCalledOnWrapped() throws Exception {
        tested.equals(tested);
        verify(wrappedMock).equalsWithoutId(tested.getWrapped());
    }

    @Test
    public void testHashCode_HashCodeWithoutIdIsCalledOnWrapped() throws Exception {
        tested.hashCode();
        verify(wrappedMock).hashCodeWithoutId(); //line 34
    }
}

如您所见,我只是创建了包装模拟并测试了 equals 和 hashcode 是否委托(delegate)了功能。

如果我单独运行测试,一切正常,但如果我依次运行两个测试,第二个测试失败并显示此消息

Wanted but not invoked:
wrappedMock.hashCodeWithoutId();
-> at com.my.app.utils.IdAgnosticWrapperTest.testHashCode_HashCodeWithoutIdIsCalledOnWrapped(IdAgnosticWrapperTest.java:34)
Actually, there were zero interactions with this mock.

为什么会这样?

最佳答案

实际上,这里发生的是 @InjectMocks 无法正确注入(inject)构造函数参数 wrapped。根据Javadoc for @InjectMocks ,这是当前的行为。因此,除非您想使用 setter 注入(inject),否则您将需要删除 @InjectMocks 注释。查看修改后的代码:

public class IdAgnosticWrapperTest {

  @Mock
  private IdAgnostic wrappedMock;

  private IdAgnosticWrapper tested;

  @BeforeMethod
  public void setUp() throws Exception {
    MockitoAnnotations.initMocks(this);

    this.tested = new IdAgnosticWrapper(this.wrappedMock);
  }

  @Test
  public void testEquals_EqualsWithoutIdIsCalledOnWrapped()
      throws Exception {
    tested.equals(tested);
    verify(wrappedMock).equalsWithoutId(tested.getWrapped());
  }

  @Test
  public void testHashCode_HashCodeWithoutIdIsCalledOnWrapped()
      throws Exception {
    tested.hashCode();
    verify(wrappedMock).hashCodeWithoutId(); //line 34
  }
}

当我运行上面的代码时,两个测试按顺序一起运行并通过了。

关于java - Mockito verify(...) 失败 - "Actually, there were zero interactions with this mock."在多次连续测试中运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35816476/

相关文章:

java - 执行者或线程防止程序关闭

Java 8 : pass method reference to another method

java - 什么是 EJB 中的本地/远程和无接口(interface) View ?

java - Mockito.verify 和 Mockito.doNothing 在 Junit 测试用例中不起作用

java - 每次测试前运行方法

junit - Intellij在控制台中不显示测试结果

java - Android - WhackAMole 游戏

java - Mockito @Before 方法在 @PostConstruct 之后调用

android - java.lang.IllegalStateException : Could not initialize plugin: MockMaker 错误

java - 如何将动态参数传递给testNG中的dataProvider方法