深圳自助建站网站,机关网站及新媒体建设实施方案,网站的表现形式,ps软件手机版下载我认为#xff0c;依赖项注入的主要好处之一是可以将模拟和/或存根对象注入代码中#xff0c;以提高可测试性#xff0c;增加测试覆盖率并编写更好#xff0c;更有意义的测试。 但是#xff0c;有时候您会遇到一些不使用依赖注入的传统代码#xff0c;而是通过组合而不是… 我认为依赖项注入的主要好处之一是可以将模拟和/或存根对象注入代码中以提高可测试性增加测试覆盖率并编写更好更有意义的测试。 但是有时候您会遇到一些不使用依赖注入的传统代码而是通过组合而不是聚合将它们结合在一起。 发生这种情况时您有三种选择 忽略该问题不编写任何测试。 疯狂地进行重构更改所有内容以使用依赖项注入。 使用PowerMock模拟构造函数 显然选项1并不是一个严肃的选项尽管我建议重构以将所有内容移至依赖项注入但这需要时间而且您必须务实。 这就是PowerMock的用处。此博客演示了如何使用PowerMock模拟构造函数这意味着当您的代码调用new时它不会创建真实的对象而是会创建模拟对象。 为了证明这个想法我们首先需要测试一些类如下所示。 public class AnyOldClass {public String someMethod() {return someMethod;}}public class UsesNewToInstantiateClass {public String createThing() {AnyOldClass myclass new AnyOldClass();String returnValue myclass.someMethod();return returnValue;}} 第一个类AnyOldClass是代码通过调用new实例化的类。 在这个例子中顾名思义它可以是任何东西。 第二个类恰当地命名为UsesNewToInstantiateClass具有一个方法createThing该方法在调用时会执行以下操作 AnyOldClass myclass new AnyOldClass(); 这一切都非常简单因此我们将快速进行PowerMock辅助的JUnit测试 import static org.easymock.EasyMock.expect;
import static org.junit.Assert.assertEquals;
import static org.powermock.api.easymock.PowerMock.expectNew;
import static org.powermock.api.easymock.PowerMock.replay;
import static org.powermock.api.easymock.PowerMock.verify;import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.easymock.annotation.Mock;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;RunWith(PowerMockRunner.class)
PrepareForTest(UsesNewToInstantiateClass.class)
public class MockConstructorTest {Mockprivate AnyOldClass anyClass;private UsesNewToInstantiateClass instance;Testpublic final void testMockConstructor() throws Exception {instance new UsesNewToInstantiateClass();expectNew(AnyOldClass.class).andReturn(anyClass);final String expected MY_OTHER_RESULT;expect(anyClass.someMethod()).andReturn(expected);replay(AnyOldClass.class, anyClass);String result instance.createThing();verify(AnyOldClass.class, anyClass);assertEquals(expected, result);}} 首先该类具有通常的PowerMock附加功能 RunWith(PowerMockRunner.class)
PrepareForTest(UsesNewToInstantiateClass.class) 在文件的顶部加上anyOldClass模拟对象的创建。 要考虑的重要代码行是 expectNew(AnyOldClass.class).andReturn(anyClass); 这行代码告诉PowerMock期望调用新的AnyOldClass并返回我们的anyClass模拟对象。 同样有趣的是重播和验证的调用。 在上面的示例中它们都有两个参数。 第一个AnyOldClass.class与上面的ExpectNew…调用有关而第二个anyClass则与简单的模拟调用ExpectanyClass.someMethod。Returnexpected;相关。 在某些时候您确实应该让new来做它所做的事情创建一个请求类型的新对象。 有一种观点认为在测试时您可能过度隔离代码而对所有内容进行模拟会降低测试的含义和价值。 对我来说没有正确的答案这是一个选择的问题。 很明显如果您的代码访问诸如数据库之类的外部资源那么您将重构并实现DI或使用PowerMock。 如果您的被测试代码不访问任何外部资源那么更多的是判断多少代码隔离过多 这也许需要一些思考并且可能是另一天另一个博客的主题…… 参考 使用PowerMock从我们的JCG合作伙伴 Roger Hughes 嘲笑 “ Captain Debugs”博客中的 构造方法 。 翻译自: https://www.javacodegeeks.com/2012/09/using-powermock-to-mock-constructors.html