如何模拟Java中其他类的内部方法返回的对象

问题描述 投票:0回答:1

我至少阅读了20条帖子,但仍然找不到答案。因此,发布此问题。可能是其他找不到的答案,我找不到。

class OuterService {
    InnerService innerService;
    @Autowired
    public void setInnerService(InnerService innerService){
        this.innerService = innerService;
    }
    public void method() {
        Class c = innerService.invokeMethod(param1, param2);
        c.invokeCMethod();  // Here c comes null while executing jUnits.
    }
}

这是我的测试班:

@SpringBootTest
@RunWith(PowerMockRunner.class)
class ClassOuterServiceTest {
    OuterService outerService = new OuterService();
    @Mock
    InnerService innerService;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
        outerService.setInnerService(innerService);
    }

    public void methodTest() {
        C c = new C();
        when(innerService.invokeMethod(param1, param2)).thenReturn(c);
        doNothing().when(c).invokeCMethod();
        outerService.method();
    }
}     

但是我在OuterService.java中的对象c内部却为空。

什么是合适的解决方案?

java junit junit4
1个回答
0
投票

不需要为OuterService创建对象,请使用@InjectMocks批注,并且在使用方法存根时仅使用模拟对象。在程序中,您正在创建c的对象。不用创建对象,只需使用@Mock注释。

注意:除非要测试静态或最终类,否则不要使用PowerMockRunner

@SpringBootTest
@RunWith(MockitoJUnitRunner.class)
public class ClassOuterServiceTest {

    @InjectMocks
    public OuterService outerService;
    @Mock
    public C c;
    @Mock
    public InnerService innerService;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void methodTest() {
        when(innerService.invokeMethod(anyString(), anyString())).thenReturn(c);
        doNothing().when(c).invokeCMethod();
        outerService.method();
    }


}

© www.soinside.com 2019 - 2024. All rights reserved.