嘲笑一些电话,不要在同一个春季服务方法中模拟一些电话

时间:2016-05-05 05:37:44

标签: java spring junit mockito

我需要为spring服务编写测试。 我必须在我的服务方法中模拟一些调用,并且一些调用必须正常工作。

意思是,我的服务方法是

myInjectingService.submit()

在服务中的那个方法里面要嘲笑的东西是

myMockService.createSomething(.....)
myMockService.verifyP(.)

不需要模拟的东西是将值保存到数据库中。 因此,在服务中,存储库将自动装配并将其保存。

我的问题是嘲弄不起作用。 是否有可能嘲笑某些东西而不是一起做某事

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "file:src/main/webapp/WEB-INF/context.xml" })
@WebAppConfiguration
@ActiveProfiles("test")
class Test {
    @Mock
    public MyMockService myMockService;

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

    @InjectMocks
    private MyInjectingService myInjectingService;

    @Autowired private Repository1 repository1; 
    @Autowired private Repository2 repository2;

    static {
        System.setProperty("spring.profiles.active", "test");
    }

    private void saveTestData() {
        //create entity objects
        Entity1 e1 = new Entity1();
        //set attributes

        //create entity objects
        Entity2 e2 = new Entity2();
        //set attributes

        //save entity objects
        repository1.save(e1);
        repository2.save(e2);
    }

    @Test
    public void submitTest() {
        saveData();     

        P p= new P();
        Mockito.when(myMockService.createSomething(Mockito.any(),Mockito.any(),Mockito.any(),Mockito.any(),Mockito.any())).thenReturn(p);
        Mockito.when(myMockService.verifyP(p)).thenReturn(1);

        Response res = myInjectingService.submit();
        assertNotNull(res);
    }
}

2 个答案:

答案 0 :(得分:1)

您可以尝试@SpydoCallRealMethod()

@Spy 
private Repository1 repository1; 
@Before
public void setUp() throws Throwable {
    MockitoAnnotations.initMocks(this);        
}

Stubbing将如下所示:

doCallRealMethod().when(repository1).doSomething1(); //real method will be called
when(repository1.doSoemthing2()).thenReturn(somethingToReturn); //will return somethingToReturn

答案 1 :(得分:0)

如果这是单元测试,那么你不必(或者甚至不应该)将值保存到数据库。你可以做的只是嘲笑存储库,这样他们就什么也做不了。在保存的同时,可能会“退货”。当找到'使用方法。这里的事情是你应该一次测试一件事 - 只是“我的注意事项”'方法,模拟它的依赖关系,并在需要时在其他地方测试它们(避免测试例如spring存储库,hibernate核心方法等)。

如果你真的需要一些讨厌的方法来调用原始方法,那么请检查doCallRealMethod。但我相信你的代码中不需要它。