Mockito-类中的模拟字段

时间:2015-11-27 07:40:39

标签: unit-testing spring-mvc mockito

我有一个与Mockito框架有关的问题。在课堂上有没有办法模拟场?可以说我们得到了:

@Component
public class A{

@Autowired
 B b;

public methodExample(){ b.doSth();}
}


public class C{

@Autowired
A a;
@Test
public void testMethodExample(){
...}
}

是否有可能模拟B对象以强加方法doSth的返回值?我知道我可以传递模拟对象作为构造函数的参数,但我想知道是否还有其他选项?

2 个答案:

答案 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);
}