Spring boot 将模拟注入更深的层次

Spring boot 将模拟注入更深的层次,spring-boot,mockito,autowired,Spring Boot,Mockito,Autowired,欢迎对更好的标题提出任何建议 我有一些豆子如下: public class ClassA { @Autowired ClassB b; ... } 及 我想编写一个测试并模拟ClassB中的ClassC实例。我们如何做到这一点? 一个很麻烦的例子: @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) public class ClassATest

欢迎对更好的标题提出任何建议

我有一些豆子如下:

public class ClassA {

    @Autowired
    ClassB b;
...
}

我想编写一个测试并模拟ClassB中的ClassC实例。我们如何做到这一点?

一个很麻烦的例子:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
 public class ClassATest {

    @InjectMocks
    ClassA a;

    @InjectMocks
    ClassB b;

    @Mock
    ClassC c;
...
    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
        a.setB(b);
    }
}
有更好的办法吗


谢谢。

该测试是集成测试吗?意思是你加载了上下文吗?@Patrick我想这是纯粹的单元测试。我没有任何与“@ContextConfiguration”相关的内容。如果没有上下文,如何自动连接ClassA?你班上有什么注解吗?@Patrick对。我用我的测试类注释更新了这个问题,如果它有帮助的话。使用
@InjectMocks
开始不是一个好的实践。最重要的是,如果您有多个级别的InjectMock,情况会更糟。我建议您重构代码,使用构造函数注入而不是字段注入,这样就不需要注入mock
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
 public class ClassATest {

    @InjectMocks
    ClassA a;

    @InjectMocks
    ClassB b;

    @Mock
    ClassC c;
...
    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
        a.setB(b);
    }
}