Java Mockito:对mocked UriBuilder的多个调用一直附加到原始URI
我目前正在为RESTAPI应用程序中的遗留代码编写一些单元测试。一个特定的api调用使用来自Jax-RS的UriInfo api生成一个URI列表。当我模拟这个接口时,我能够让测试运行,但是对接口的每个调用似乎都重用同一个URI对象并反复附加到它,而不是将一个新的URI对象传递给测试代码。我有一个带有测试的示例类,演示了这个问题:Java Mockito:对mocked UriBuilder的多个调用一直附加到原始URI,java,unit-testing,junit,mockito,Java,Unit Testing,Junit,Mockito,我目前正在为RESTAPI应用程序中的遗留代码编写一些单元测试。一个特定的api调用使用来自Jax-RS的UriInfo api生成一个URI列表。当我模拟这个接口时,我能够让测试运行,但是对接口的每个调用似乎都重用同一个URI对象并反复附加到它,而不是将一个新的URI对象传递给测试代码。我有一个带有测试的示例类,演示了这个问题: import java.net.URI; import java.util.LinkedList; import java.util.List; import jav
import java.net.URI;
import java.util.LinkedList;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.UriInfo;
@Stateless
@Path("/")
public class MockitoUrl {
@PersistenceContext(name = "MockitoTestPU")
private EntityManager em;
@Context
private UriInfo uriInfo;
@Path("system")
@GET
@Produces("text")
public List<URI> generateUris() {
List<URI> uris = new LinkedList<>();
for (int i=1;i<5;i++) {
final URI uri = uriInfo.getBaseUriBuilder().path(
MockitoUrl.class, "generateUris").build("test");
System.out.println(uri.toString());
}
return uris;
}
}
我希望它每次都返回相同的URI。在实际应用程序中,这些URI将具有更多细节,并且每个URI都具有来自JPA类查找的不同数据。似乎每次都返回同一个对象,然后再次附加到该对象
有没有办法让Mockito在每次调用uriInfo.getBaseUriBuilder()时都返回一个新的URI,或者这是我对Mockito工作原理的一个基本误解?您面临的问题是预期行为。设置模拟时,您创建一个实例,并始终返回该实例 为了得到您想要的,我建议使用
when(..),然后回答(I->UriBuilder.fromUri(baseUri))
这样,每次调用都会执行提供的lambda,并且每次调用都会创建一个新实例。您面临的问题是预期行为。设置模拟时,您创建一个实例,并始终返回该实例 为了得到您想要的,我建议使用
when(..),然后回答(I->UriBuilder.fromUri(baseUri))
这样,每个调用都会执行提供的lambda,并且每次调用都会创建一个新实例
import java.net.URI;
import java.util.List;
import javax.persistence.EntityManager;
import javax.ws.rs.core.UriBuilder;
import javax.ws.rs.core.UriInfo;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.*;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import static org.mockito.Mockito.when;
import org.mockito.MockitoAnnotations;
public class MockitoUrlTest {
@Mock
private EntityManager em;
@Mock
private UriInfo uri;
@InjectMocks
MockitoUrl mockitoUrl;
public MockitoUrlTest() {
}
@Before
public void setUp() {
mockitoUrl = new MockitoUrl();
MockitoAnnotations.initMocks(this);
}
@Test
public void testGenerateUris() throws Exception {
System.out.println("generateUris");
String baseUri = "http://server1/api";
when(uri.getBaseUriBuilder()).thenReturn(UriBuilder.fromUri(baseUri));
List<URI>result = mockitoUrl.generateUris();
for (URI u : result) {
assertTrue(u instanceof URI);
System.out.println(u.toString());
}
}
}
generateUris
http://server1/api/system
http://server1/api/system/system
http://server1/api/system/system/system
http://server1/api/system/system/system/system