Java 模拟并注入继承的字段
我在继承和编写单元测试方面有问题。当我要测试的类继承了这个字段时,我不知道如何将mock作为字段注入。注意,我不能存根任何东西,因为测试类是一个额外的测试包。我只想让Java 模拟并注入继承的字段,java,unit-testing,inheritance,junit,mockito,Java,Unit Testing,Inheritance,Junit,Mockito,我在继承和编写单元测试方面有问题。当我要测试的类继承了这个字段时,我不知道如何将mock作为字段注入。注意,我不能存根任何东西,因为测试类是一个额外的测试包。我只想让myService.getSomething()调用正常工作 public class A{ @Autowired private Service myService; protected void doSomething(){ // someValue = mySe
myService.getSomething()
调用正常工作
public class A{
@Autowired
private Service myService;
protected void doSomething(){
//
someValue = myService.getSomething();
}
和类B,它继承了以下方法:
public class B extends A{
public void someMethod(){
doSomething();
}
}
这将是我的测试类:
public class TestB{
@Mock
private Service myService;
@InjectMocks
private B classUnderTest = new B();
@Before
public void setUp(){
MockitoAnnotations.initMocks(this);
}
@Test
public void testSomeMethod(){
SomeValue someValue = new SomeValue();
doReturn(someValue).when(myService).getSomething();
classUnderTest.doSomething();
}
}
感谢您的帮助。一种可能的方法是使用java反射在运行时设置/更改字段:
Field parentService = classUnderTest.getClass().getSuperclass().getDeclaredField("myService");
parentService.setAccessible(true);
parentService.set(classUnderTest, myService_mock);
我也在寻找解决方案,这对我很有效
参考资料:一种可能的方法是使用java反射在运行时设置/更改字段:
Field parentService = classUnderTest.getClass().getSuperclass().getDeclaredField("myService");
parentService.setAccessible(true);
parentService.set(classUnderTest, myService_mock);
我也在寻找解决方案,这对我很有效
参考资料:我建议您重写子级中的方法,并在子级中调用父级方法。问题不是类A的
doSomething()
调用,而是myService
在父级中为您的服务创建一个setter,并在您的子级上覆盖它。春天的设定器可以是自动连线的。或者在父对象中创建一个´@Autowired`构造函数,在子对象中创建另一个,并调用父对象。然后注入模拟依赖项。这可能会有所帮助:我建议您重写子级中的方法,并在子级中调用父级方法。问题不是类A的doSomething()
调用,而是myService
在父级中为您的服务创建一个setter,并在子级上覆盖它。春天的设定器可以是自动连线的。或者在父对象中创建一个´@Autowired`构造函数,在子对象中创建另一个,并调用父对象。然后注入模拟依赖项。这可能会有帮助: