Java 如何模拟本地创建的对象?

Java 如何模拟本地创建的对象?,java,junit,powermock,powermockito,Java,Junit,Powermock,Powermockito,这是我的课 class Test { public void print(){ RestTemplate restTemplate = new RestTemplate(); restTemplate.getForObject("url", String.class); } } 为了测试这个类,我想模拟“RestTemplate”。有没有什么方法可以在不更改代码的情况下做到这一点。如果不更改代码,就无法做到这一点,至少不能以优雅的方式做到这一点

这是我的课

class Test {
    public void print(){
        RestTemplate restTemplate = new RestTemplate(); 
        restTemplate.getForObject("url", String.class);
    }
}
为了测试这个类,我想模拟“RestTemplate”。有没有什么方法可以在不更改代码的情况下做到这一点。

如果不更改代码,就无法做到这一点,至少不能以优雅的方式做到这一点

每次输入
print()
方法时,都会创建一个新的
restemplate
实例,因此无法传入模拟

稍微更改方法以使用RestTemplate作为参数。在运行时,这将是RestTemplate的一个实际实例,但在对该方法进行单元测试时,它能够接受模拟

class Test {
    public void print(RestTemplate restTemplate){
        restTemplate.getForObject("url", String.class);
    }
}

class TestTest {

    private final Test instance = new Test();

    @Test
    public testPrint() {
        RestTemplate restTemplateMock = mock(RestTemplate.class);

        instance.print(restTemplateMock);

        // TODO: verify method calls on the mock
    }
}

您希望在测试中使用
restemplate
的注入实例

@Autowired
private TestRestTemplate restTemplate;

在测试设置中,您可以根据需要模拟
restTemplate
的行为。

您不能。这就是为什么Spring的核心是一个依赖注入框架。将依赖项作为参数传递给组件构造函数(或setters)。依赖项注入可以使用,但如果可以将源代码改为接受注入的依赖项,则确实不应该这样做。实际上,可以使用字节码操纵来模拟构造函数,但无论是否应该,这是另一个问题。仅仅为了使一个类可测试而对一个问题使用spring有点过头了。。。