我正在尝试使用@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/