2017-02-17 57 views
0

我想单元测试使用EasyMock的类。为了简化,我在下面做了一个例子。我想要的是在测试期间将StringBuilder实例替换为EasyMock实例。 (因为它不是我想要测试的StringBuilder的功能。)不幸的是,这在下面的例子中不起作用。在其他测试中,我通过使用EasyMock实例设置实例变量来解决问题,但对于此示例,我无法执行此操作,因为它是我关心的本地实例化对象。如何用Easymock替换我的实例

谁能帮我一把吗?

类来进行测试:

package example.easymock 

public class Example { 

    public String exampleMethod() { 
     StringBuilder string = new StringBuilder(); 
     string.append("hello"); 
     return string.toString(); 
    } 
} 

测试类:

package example.easymock 

import needed classes 

public class ExampleTest { 

    @Test 
    public void exampleMethodTest() { 
     StringBuilder stringMock = EasyMock.createMock(); 
     Example example = new Example(); 
     stringMock.append("hello"); 
     EasyMock.expect(stringMock.toString()).andReturn("hi"); 

     EasyMock.replay(stringMock); 

     example.exampleMethod(); 
    } 
} 

回答

2

只需使用EasyMock这将是不可能的。 PowerMock确实包含这动力然而要做到:

expectNew(StringBuilder.class).andReturn(stringMock); 

您需要为正确设置PowerMock配置,当然工作 - 看到更多的here

这并不能改变一个事实,那正是这种不可能性(部分)导致广泛采用Inversion of Control作为设计原则。另外,通常情况下,您无法测试的任何方法都是可以重构为更好(可测试)的方法。 PowerMock应该只用于测试代码本身不能改变时更好。

这当然假设StringBuilder只是一个例子,而不是字面上你想要做的。如果是 - 不要打扰,那么可以假定任何属于语言库的方法都是按广告方式工作的。

+0

PowerMock实际上可以模拟类的构造函数。所以它*可能与PowerMock。 – dav1d

+0

@ dav1d该死的,那件事情是强大的,真实的。 – Deltharis

+0

只需添加如何使用TestNG + PowerMock + Mockito进行测试就很有帮助:准备要测试的类:''@PrepareForTest(SomeService.class)''然后只是“构造函数”:'whenNew(Date 。的.class).withNoArguments()thenReturn(现在);' – dav1d

相关问题