Java 模拟并注入继承的字段

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

我在继承和编写单元测试方面有问题。当我要测试的类继承了这个字段时,我不知道如何将mock作为字段注入。注意,我不能存根任何东西,因为测试类是一个额外的测试包。我只想让
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`构造函数,在子对象中创建另一个,并调用父对象。然后注入模拟依赖项。这可能会有帮助: