首页 > 解决方案 > 仅模拟被测类中的某些字段

问题描述

我有一个正在测试的课程。例如

@Service
public classs AService {
   @Autowired
   Field1 field1;
   @Autowired
   Field2 field2;

   void foo() { // .... }
}

我想嘲笑field1但不是field2

我使用mockito如下

@RunWith(SpringRunner.class)
@SpringBootTest
public class AServiceTest {

@Mock
private Field1 field1;

@InjectMocks
private AService aService;

@Before
public void setUp() {
    MockitoAnnotations.initMocks(this);
}

@Test
public void fooTest() {
// setup mocking behaviour and test
}

但正如预期的那样,在这种情况下field2测试运行时为空。请注意,这Field2是 SpringBoot 转换为代码(例如 a Repository)的接口,因此我不能/不想显式实例化它。

有什么想法吗?

标签: springspring-bootmockito

解决方案


由于您使用的是 Spring Boot,因此@SpringBootTest您无需担心自己使用@InjectMocks. 只需将 field1 定义为 a @MockBean@Autowire您的服务和 Spring boot 就会为您完成所有工作:

@RunWith(SpringRunner.class)
@SpringBootTest
public class AServiceTest {

@MockBean
private Field1 field1;

@Autowired
private AService aService;

@Test
public void fooTest() {
// setup mocking behaviour and test
}

推荐阅读