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方法添加到类中,仅由测试使用.或者,使用自动装配的构造函数而不是自动装配的字段,并将测试依赖项注入其中.
尽管可以通过反射设置这些字段,但这样做会阻止您的开发工具查找这些字段的用法,并使您SomeClassToTest在将来更难以重构.
最好为这些字段添加公共setter,并将@Autowired注释放在这些字段上.这不仅避免了反射,而且还阐明了类的外部接口,并确保您的单元测试仅使用此接口.我看到SomeClassToTest已经实现了SomeOtherClass接口,并且我假设客户端SomeClassToTest只使用这个接口,因此将setter设置为SomeClassToTestpublic 是没有什么危险的.
更好的是,使用构造函数注入并使字段最终.您仍然可以使用@Autowired构造函数参数.
| 归档时间: |
|
| 查看次数: |
16595 次 |
| 最近记录: |