USe*_*299 36 java junit spring mocking mockito
我有一个A类,它使用3个不同的类和自动装配
public class A () {
@Autowired
private B b;
@Autowired
private C c;
@Autowired
private D d;
}
Run Code Online (Sandbox Code Playgroud)
在测试它们时,我希望只有2个类(B&C)作为模拟,并且将D类自动装配为正常运行,此代码对我不起作用:
@RunWith(MockitoJUnitRunner.class)
public class aTest () {
@InjectMocks
private A a;
@Mock
private B b;
@Mock
private C c;
@Autowired
private D d;
}
Run Code Online (Sandbox Code Playgroud)
甚至可以这样做吗?
Saj*_*ran 37
应该是这样的
@RunWith(SpringJUnit4ClassRunner.class)
public class aTest () {
@Mock
private B b;
@Mock
private C c;
@Autowired
@InjectMocks
private A a;
}
Run Code Online (Sandbox Code Playgroud)
如果你想D
成为Autowired
不需要你做任何事情Test
类.你Autowired
A
应该有正确的实例D
.此外,我认为你需要使用SpringJUnit4ClassRunner
的Autowiring
工作,用contextConfiguration
正确的设定.因为你没有使用MockitoJunitRunner
你需要初始化mocks
自己使用
MockitoAnnotations.initMocks(java.lang.Object testClass)
ant*_*ar9 15
除了接受的答案之外,如果您使用 spring-boot,使用@MockBean注释会更容易(创建一个模拟并将其作为 bean 添加到上下文中,如果存在则替换它):
@RunWith(SpringRunner.class)
public class aTest () {
@MockBean
private B b;
@MockBean
private C c;
@Autowired
private A a;
}
Run Code Online (Sandbox Code Playgroud)
如果您不使用 spring-boot,@Autowired + @InjectMocks 的问题是 Spring 将首先加载 bean B 和 C 不需要的实例,然后将它们替换为模拟。这是一种浪费,并且可能具有您不想要/无法加载的传递依赖项。始终建议为测试加载最小的 Spring 上下文。我会推荐这个:
@RunWith(SpringRunner.class)
@Import({A.class, D.class})
@ContextConfiguration(classes = aTest.class)
public class aTest () {
@Bean
private B b() {
return Mockito.mock(B.class);
}
@Bean
private C c() {
return Mockito.mock(C.class);
}
@Autowired
private A a;
}
Run Code Online (Sandbox Code Playgroud)
我遇到了同样的问题,并尝试了Sajan Chandran的回答.它在我的情况下不起作用,因为我使用@SpringBootTest注释只加载我所有bean的一个子集.目标不是加载我正在嘲笑的bean,因为它们有很多其他依赖项和配置.
我发现以下解决方案的变体对我有用,在正常情况下也可以使用.
@RunWith(SpringRunner.class)
@SpringBootTest(classes={...classesRequired...})
public class aTest () {
@Mock
private B b;
@Mock
private C c;
@Autowired
@Spy
private D d;
@InjectMocks
private A a;
@Before
public void init(){
MockitoAnnotations.initMocks(this);
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
30663 次 |
最近记录: |