【问题标题】:Mockito: injected mock class not injected for other classesMockito:注入的模拟类不为其他类注入
【发布时间】:2016-10-24 14:45:59
【问题描述】:

所以我有一个简单的java类:

@Component
public class IWantToTestThisClass {

@Autowired
private ClassA classA;

@Autowired 
private ClassB classB;

public ObjectA doIt(...) {
   classB.returnObject();
}

A 类包含:

@Component
public class ClassA { 

@Autowired 
private ClassB classB;

public ObjectA doIt() {
   classB.returnObject(...);
}

B 类:

@Component
public class ClassB { 

public ObjectA returnObject(...) {
   ...
}

我的测试设置如下所示:

@InjectMocks
private IWantToTestThisClass iWantToTestThisClass;

@Mock
private ClassA classA;

@Mock
private ClassB classB;

@Before
public void setUp() {
    initMocks(this);

    when(classA.doSmt()).thenCallRealMethod();
    when(classB.doSmt()).thenCallRealMethod();
}

问题是ClassA没有注入ClassB。

然后通过classA调用returnObject(ClassB)它返回NullPointerException(ClassB没有被模拟/注入)。

如果通过 IWantToTestThisClass 调用 returnObject(classB) 就可以了。

这是一种同时为两个类注入 ClassB 的方法吗?我想调用真实的方法,而不是模拟的方法。

【问题讨论】:

标签: java spring unit-testing mocking mockito


【解决方案1】:

您将模拟注入 IWantToTestThisClass,而不是 ClassA。所以 ClassA 中没有模拟,B 也没有注入那里。

尝试在classA之前添加@InjectMocks

或者你可以这样做:

ClassB mB = Mockito.mock(ClassB.class);
classA.setClassB(mB);

如果将 setter setClassB(...) 添加到 ClassA

【讨论】:

    【解决方案2】:

    @Autowired 可以被构造函数注入替换。因此,您的 A 类将是:

    @Component
    public class ClassA { 
    
        private static ClassB classB;
    
        public ClassA(ClassB classB){
            this.classB=classB;
        }
    
        public ObjectA doIt() {
           classB.returnObject(...);
        }
    }
    

    通过这种方式,您可以稍后在 @Before setUp 方法中注入 classB 模拟:

    @Before
    public void setUp() {
        initMocks(this);
        when(classA.doSmt()).thenCallRealMethod();
        when(classB.doSmt()).thenCallRealMethod();
        classB = new classB(classA);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多