有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Mockito验证(…)fails“实际上,与此模拟没有任何交互。”按顺序在多个测试运行中

我有一个包装器类,它导致在包装对象上调用方法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是一个简单的接口,它确保存在所需的方法

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

然后我有一些单元测试应该测试,如果equals()委托给wrapped#equalsWithoutId()方法,hashCode()委托给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
    }
}

如您所见,我只是创建了包装的mock,并测试equals和hashcode是否委托了功能

如果我单独运行测试,一切正常,但是如果我按顺序运行两个测试,第二个测试将失败,并显示以下消息

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.

为什么会发生这种情况


共 (1) 个答案

  1. # 1 楼答案

    实际上,这里发生的事情是@InjectMocks无法正确地注入构造函数参数wrapped。根据Javadoc for ^{},这是当前的行为。因此,除非您想使用setter注入,否则需要删除@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
      }
    }
    

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