java - Mockito @Mock 不使用构造函数注入(inject)正确注入(inject)命名模拟

标签 java unit-testing mockito

我正在尝试使用@Mock 将两个不同的对象注入(inject)到我的被测类中。我需要它们是两个不同的对象,这样我就可以在每个对象上使用 when 来产生不同的结果。我在 SO 上搜索的所有内容都指向此工作,但在运行下面的测试时 - 两个对象都是相同的模拟。

import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.when;

import com.ihm.pp.test.UnitTest;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;

/**
 * @author Josh Johnston
 */
@Category(UnitTest.class)
@RunWith(MockitoJUnitRunner.class)
public class ConstructorInjectionBug {

  @Mock
  private IBroken aBroken;

  @Mock
  private IBroken bBroken;

  @InjectMocks
  private UsesBroken usesBroken;

  @Test
  public void testBrokenConstructorInjection() {

    when(bBroken.getNumber()).thenReturn(2);
    assertEquals(2, usesBroken.getbBroken().getNumber());

    when(aBroken.getNumber()).thenReturn(1);
    assertEquals(1, usesBroken.getaBroken().getNumber());
  }
}

interface IBroken {
  int getNumber();
}

class UsesBroken {

  private IBroken aBroken;
  private IBroken bBroken;

  public UsesBroken(IBroken aBroken, IBroken bBroken) {
    this.aBroken = aBroken;
    this.bBroken = bBroken;
  }

  public IBroken getaBroken() {
    return aBroken;
  }

  public IBroken getbBroken() {
    return bBroken;
  }
}

结果:

java.lang.AssertionError:
    Expected :1
    Actual   :2

at org.junit.Assert.failNotEquals(Assert.java:834)
    at org.junit.Assert.assertEquals(Assert.java:645)
    at org.junit.Assert.assertEquals(Assert.java:631)
    at ConstructorInjectionBug.testBrokenConstructorInjection(ConstructorInjectionBug.java:37)

最佳答案

@InjectMocks 不知道要注入(inject)哪个 IBroken。所以不是它坏了,更多的是设计有缺陷。

您需要将模拟显式注入(inject)被测对象以获得所需的行为。

@Category(UnitTest.class)
@RunWith(MockitoJUnitRunner.class)
public class ConstructorInjectionBug {

  @Mock
  private IBroken aBroken;

  @Mock
  private IBroken bBroken;

  private UsesBroken usesBroken;

  @Test
  public void testBrokenConstructorInjection() {
    //Arrange
    usesBroken = new UsesBroken(aBroken, bBroken);
    when(bBroken.getNumber()).thenReturn(2);
    when(aBroken.getNumber()).thenReturn(1);

    //Act & Assert
    assertEquals(2, usesBroken.getbBroken().getNumber());    
    assertEquals(1, usesBroken.getaBroken().getNumber());
  }
}

关于java - Mockito @Mock 不使用构造函数注入(inject)正确注入(inject)命名模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53860458/

相关文章:

java - 如何在进度微调器中显示数字

Java单元测试检查方法是否在不执行的情况下被调用

java - Mockito 中的嵌套方法模拟

java - 使用子类测试抽象类中的具体方法

java - 将 VBA 脚本添加到 Office Word 文档

java - 将两个 catch 子句组合在一起

java - heroku 和 hibernate 5 - NoSuchMethodError : CoreMessageLogger. 调试

javascript - 在 jasmine 单元测试中使用嵌套描述语句时,为什么 karma 或 Webstorm 会崩溃?错误: Cannot read property * of undefined?

android - Android 上的单元测试和功能测试

java - 需要访问存储库的测试方法