使用Junit和EasyMock对使用自动装配符号的类进行单元测试?

sc_*_*ray 27 junit spring unit-testing dependency-injection mocking

我正在尝试为一个类标记@Autowired写一个单元测试.鉴于Spring正在自动解析这些字段的具体实现,我很难弄清楚如何在测试运行期间插入我的Mock对象(通过EasyMock创建)作为依赖项.在课堂上使用@Autowired意味着在该课程中缺少setter.有没有办法让我插入我的模拟对象而不在课堂上创建额外的setter?

这是我想要完成的一个例子:

public class SomeClassUnderTest implements SomeOtherClass{

@Autowired
private SomeType someType;

@Autowired
private SomeOtherType someOtherType;

@Override
public SomeReturnType someMethodIWouldLikeToTest(){
//Uses someType and someOtherType and returns SomeReturnType
}

}
Run Code Online (Sandbox Code Playgroud)

这是我在碰壁之前制作Test类的方法:

public class MyTestClassForSomeClassUnderTest{
  private SomeType someType;
  private SomeOtherType someOtherType;

  @Before
  public void testSetUp(){
    SomeClassUnderTest someClassToTest = new SomeClassUnderTest();
    someType = EasyMock.createMock(SomeType.class);
    someOtherType = EasyMock.createMock(SomeOtherType.class);
    //How to set dependencies????
  }

  @Test
  public void TestSomeMethodIWouldLikeToTest(){
    //??????
  } 

}
Run Code Online (Sandbox Code Playgroud)

推动正确的方向将会很棒.

谢谢

ska*_*man 34

您可以使用ReflectionTestUtils,例如,反射性地将依赖项直接注入到字段中

ReflectionTestUtils.setField( testInstance, "fieldName", fieldValue );
Run Code Online (Sandbox Code Playgroud)

有些人会争辩说,无论如何最好将类包装可见的setter方法添加到类中,仅由测试使用.或者,使用自动装配的构造函数而不是自动装配的字段,并将测试依赖项注入其中.


Kkk*_*kev 6

尽管可以通过反射设置这些字段,但这样做会阻止您的开发工具查找这些字段的用法,并使您SomeClassToTest在将来更难以重构.

最好为这些字段添加公共setter,并将@Autowired注释放在这些字段上.这不仅避免了反射,而且还阐明了类的外部接口,并确保您的单元测试仅使用此接口.我看到SomeClassToTest已经实现了SomeOtherClass接口,并且我假设客户端SomeClassToTest只使用这个接口,因此将setter设置为SomeClassToTestpublic 是没有什么危险的.

更好的是,使用构造函数注入并使字段最终.您仍然可以使用@Autowired构造函数参数.