当前位置: 首页 > 知识库问答 >
问题:

Mockito:注入的模拟类,而不是为其他类注入的

徐焱
2023-03-14

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

@Component
public class IWantToTestThisClass {

@Autowired
private ClassA classA;

@Autowired 
private ClassB classB;

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

ClassA包含:

@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();
}

问题是ClassB不是为ClassA注入的。

然后通过classA调用returnObject(ClassB),它返回NullPointerException(ClassB不是模拟/注入的)。

如果通过IWantToTestThisClass调用returObject(class B),则可以。

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

共有2个答案

黄仲渊
2023-03-14

@Autowired可以被构造函数注入替换。那么,你的课程A将是:

@Component
public class ClassA { 

    private static ClassB classB;

    public ClassA(ClassB classB){
        this.classB=classB;
    }

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

通过这种方式,您可以稍后在@Front setUp方法中注入class B mock:

@Before
public void setUp() {
    initMocks(this);
    when(classA.doSmt()).thenCallRealMethod();
    when(classB.doSmt()).thenCallRealMethod();
    classB = new classB(classA);
}
李景天
2023-03-14

你把mock注入我的课堂,而不是A课堂。所以A类中没有模拟,B类中没有注入。

尝试在类A之前添加@InjectMocks

或者你可以这样做:

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

如果添加setter setClassB(…)去ClassA

 类似资料:
  • 可以模拟抽象类,也可以使用Mockito注释将模拟类注入抽象类。我现在有以下情况: 我想在AbstractClassUnderTest上使用类似@InjectMocks的东西,但它不能与@Mock结合使用。Powermock的Whitebox的当前情况是有效的,但我很好奇是否可以通过注释来解决它。我找不到任何解决方案或示例。 (我知道对测试抽象类的反对意见,我个人更愿意测试一个具体的实现,只使用@

  • 问题内容: 我有以下代码: 我想使用Mockito创建一个测试。我编写了如下测试: 我在网上收到NullPointerException: ,它表示“策略”列表已初始化,但为空。Mohito有什么办法可以像Spring一样浪费时间?是否将所有实现接口“策略”的实例自动添加到列表中? 顺便说一句,我在Wrapper类中没有任何二传手,如果可能的话,我想以这种方式离开。 问题答案: Mockito不知

  • 问题内容: 我想将Mockito模拟对象注入到Spring(3+)bean中,以进行JUnit的单元测试。我的bean依赖项当前是通过在私有成员字段上使用注释来注入的。 我考虑过使用,但是我希望注入的bean实例实际上是一个代理,因此没有声明目标类的私有成员字段。我不希望为依赖项创建一个公共的setter,因为我将纯粹出于测试目的而修改接口。 我遵循了Spring社区提供的一些建议,但是未创建该模

  • 问题内容: 我有以下课程: 和测试类: 如何在MyClass中将Apple实例作为模拟注入? 问题答案: 您可以通过3种方式解决此问题: 抽象工厂 :使用具体的工厂类,而不是使用静态方法: 在测试类中,模拟工厂: PowerMock :使用PowerMock创建静态方法的模拟。查看我对一个相关问题的答案,看看它是如何完成的。 可测试的类 :将创建的内容包装在方法中,并创建一个覆盖它的测试类: 当然

  • 所以我有一个类需要测试。我们把它叫做ClassToTest。它有两个Dao对象作为字段。 正如您所看到的,ClassToTest不包含任何构造函数或setter,我正在使用spring自动关联字段。 现在,我有了一个具有classToTest所需的所有依赖项的基本测试类: 并且testClass扩展了这个BaseTest类: 这将导致保存时出现空指针异常。但是,如果我将设置方法更改为: 考试通过了