我有一个与Mockito框架有关的问题。在课堂上有没有办法模拟场?可以说我们得到了:
@Component
public class A{
@Autowired
B b;
public methodExample(){ b.doSth();}
}
public class C{
@Autowired
A a;
@Test
public void testMethodExample(){
...}
}
是否有可能模拟B对象以强加方法doSth的返回值?我知道我可以传递模拟对象作为构造函数的参数,但我想知道是否还有其他选项?
答案 0 :(得分:4)
您可以查看@InjectMocks。 有了这个注释,Mockito将尝试分别通过构造函数,属性和字段分配模拟,在第一个成功的方法停止。 因此,您的场景的单元测试可能如下所示:
@InjectMocks
值得关注的一些要点:
@Mock
只会考虑使用MockitoJUnitRunner
org.mockito.MockitoAnnotations.initMocks(this);
或致电MultipartFormData(Map(filename -> List(abcd)),List(),List(),List())
以创建和注入您的模拟是必要的。答案 1 :(得分:1)
您可以提供受保护的setter,仅用于测试,并使您的测试包结构镜像主代码的包结构。
或者您可以根据需要使用Powermock扩展模拟私有/受保护字段。
见
https://code.google.com/p/powermock/wiki/BypassEncapsulation
@Test
public void testDoSomething(){
A a = new A();
B mockedB = //create a mock;
Whitebox.setInternalState(a, "b", mockedB);
}