我需要为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);
}
}
答案 0 :(得分:1)
您可以尝试@Spy和doCallRealMethod()
@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。但我相信你的代码中不需要它。