Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Mockito:对mocked UriBuilder的多个调用一直附加到原始URI_Java_Unit Testing_Junit_Mockito - Fatal编程技术网

Java Mockito:对mocked UriBuilder的多个调用一直附加到原始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

我目前正在为RESTAPI应用程序中的遗留代码编写一些单元测试。一个特定的api调用使用来自Jax-RS的UriInfo api生成一个URI列表。当我模拟这个接口时,我能够让测试运行,但是对接口的每个调用似乎都重用同一个URI对象并反复附加到它,而不是将一个新的URI对象传递给测试代码。我有一个带有测试的示例类,演示了这个问题:

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