使用PowerMockito如何阻止静态代码块的运行一、前言在我进行单元测试mock静态类的时候,突然出现了这个异常我就很懵逼啊,无奈只能一步一步的进去查找问题结果发现问题出现在静态类当中,那是肯定的,...;import org.powermock.core.classloader.annotations.PrepareForTest;import org.powermock.modules.junit4...@date 2024/07/16 20:20:46 */@RunWith(PowerMockRunner.class)@PrepareForTest(PowerMockitoUtil.class)public...}}一执行单测,就报错了,报错截图如下三、修复我们在单测的时候, 不可能为了单测去修改除测试方法以外的代码逻辑的比如这次的PowerMockitoUtil.java,当中的静态代码块虽然只是我的模拟...;import org.powermock.core.classloader.annotations.PrepareForTest;import org.powermock.core.classloader.annotations.SuppressStaticInitializationFor
选择哪个单元测试框架 目前应用比较普遍的java单元测试工具junit4+Mock(Mockito、jmock、EasyMock、powermock)。为什么会选powermock?...什么是powerMocker PowerMock是一个框架,它以更强大的功能扩展了其他模拟库,例如EasyMock。...PowerMock使用自定义的类加载器和字节码操作来模拟静态方法,构造函数, 最终类和方法,私有方法,删除静态初始化程序等。...熟悉受支持的模拟框架的开发人员会发现PowerMock易于使用,因为整个期望API都是相同的, 无论是静态方法还是构造函数。...@PrepareForTest({DemoDao.class}) 所有需要测试的类列在此处,适用于模拟final类或有final, private, static, native方法的类。
解决方案:仅在必要时使用PowerMock,优先考虑重构代码以减少对外部依赖的直接引用,或通过设计模式(如依赖注入)来提高代码的测试性。3....忽视PowerMock的最佳实践不遵循最佳实践,如未正确清理模拟对象,可能会导致测试间相互影响。...解决方案:每次测试后清理模拟行为,使用@After或@AfterClass注解的方法来确保测试环境的干净。代码示例:静态方法模拟下面的例子展示了如何使用PowerMock模拟一个静态方法。.../dependency>接着是测试代码示例:java复制代码import org.junit.runner.RunWith;import org.mockito.Mockito;import org.powermock.core.classloader.annotations.PrepareForTest...;import org.powermock.modules.junit4.PowerMockRunner;@RunWith(PowerMockRunner.class)@PrepareForTest(StaticClass.class
解决方案:仅在必要时使用PowerMock,优先考虑重构代码以减少对外部依赖的直接引用,或通过设计模式(如依赖注入)来提高代码的测试性。 3....忽视PowerMock的最佳实践 不遵循最佳实践,如未正确清理模拟对象,可能会导致测试间相互影响。...解决方案:每次测试后清理模拟行为,使用@After或@AfterClass注解的方法来确保测试环境的干净。 代码示例:静态方法模拟 下面的例子展示了如何使用PowerMock模拟一个静态方法。...scope> 接着是测试代码示例: import org.junit.runner.RunWith; import org.mockito.Mockito; import org.powermock.core.classloader.annotations.PrepareForTest...; import org.powermock.modules.junit4.PowerMockRunner; @RunWith(PowerMockRunner.class) @PrepareForTest
要消除前面提到的坏味道,就需要将这些静态方法修改为实例方法,并通过依赖注入的方式注入。这个变化带来的是对整个系统的全局影响,即使我们有一些自动化重构的手段,仍然不认为这种重构一定就是可行的。...在使用PowerMock编写测试时,首先需要在测试类上运用框架提供的Annotation:@PrepareForTest,以及一个Runner:PowerMockRunner。...接下来就可以调用Mockito框架的方法,对我们要模拟的方法findAll()进行模拟,这里主要的工作是为模拟方法的返回值设置一个stub。之后就是单元测试的验证逻辑。...因为是实例方法,所以下面的测试方法通过调用setTableUtil()方法将被模拟的对象注入到EmployeeRepository对象中: @Test public void should_mock_private_method...)@PrepareForTest(EmployeeTableUtil.class)@SuppressStaticInitializationFor("com.agiledon.powermock.EmployeeTableUtil
PowerMock是什么? PowerMock是一个Java模拟框架,可用于解决通常认为很难甚至无法测试的测试问题。...使用PowerMock,可以模拟静态方法,删除静态初始化程序,允许模拟而不依赖于注入,等等。PowerMock通过在执行测试时在运行时修改字节码来完成这些技巧。...这个时候就可以使用PowerMock,拦截数据库操作,并模拟返回参数。 2. PowerMock包引入 模拟静态方法类似于模拟构造函数,也需要加入注释标记。...模拟静态类类似于模拟静态方法。
PowerMock可以实现完成对private/static/final方法的Mock(模拟),而Mockito可以对普通的方法进行Mock,如:public等。...SpringJUnit4ClassRunner.class) public class UserAppServiceTest { @InjectMocks //创建一个实例,其余用@Mock(或@Spy)注解创建的mock将被注入到用该实例中...出来的)的Mock(模拟)。...–@PrepareForTest( { YourClassWithEgStaticMethod.class }) // 如果你的测试用例里没有使用注解@PrepareForTest...当你需要使用PowerMock强大功能(Mock静态、final、私有方法等)的时候,就需要加注解@PrepareForTest。
private static final Singleton INSTANCE 静态方法/变量 getInstance()是一个静态方法,常用的通过new的方式来注入一个mock对象的方法不能使用。...而通过Powermock,则可以解决上述问题。...; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4...@RunWith( PowerMockRunner.class ) @PrepareForTest(Singleton.class ) public class ClassToUseSingletonTest...mockSingleton); 这样,就实现了当调用SingletonInstance.INSTANCE时,将返回被mock过的Singleton对象mockSingleton ,也就是实现了对于单例模式的模拟
FileInputStream、InputStreamReader、BufferedReader都是在read方法的执行过程中临时new出来的,无法通过ReaderDemo的构造方法或者修改成员变量等方式进行注入...解决方法 幸好Powermock提供了whenNew这样一个Mock方法,可以解决上述临时变量的问题。...demo案例的测试用例如下 import static org.junit.Assert.assertEquals; import static org.powermock.api.mockito.PowerMockito.doReturn...; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4....PowerMockRunner; @RunWith(PowerMockRunner.class) @PrepareForTest({ ReaderDemo.class }) public class
powermock-module-junit4 2.0.0 test org.powermock powermock-api-mockito2 2.0.0 test mock静态方法 什么时候mock...只有被spy出来的类,才可以对私有方法进行mock UserSourceController spy = PowerMockito.spy(new UserSourceController()); // 模拟私有方法...(spy, Mockito.times(1)).invoke(“getUserName”, “zhangsan”); assertEquals(“laozheng”, userName); } 总结 为什么...但powermock可以mock静态方法,因为它直接在字节码上工作。...@PrepareForTest必须写在类上,不能写到具体的测试方法上否则会报错:java.lang.Exception: No tests found matching Method。
注解说明 现有一个待测试的类UserServiceImpl,该类中注入了一个UserMapper的类实例。...@PrepareForTest({UserServiceImpl.class, DateUtil.class, UserMapper.class}) @PrepareForTest 注解是用来添加所有需要测试的类...@InjectMocks 注解会主动将已存在的mock对象注入到bean中,按名称注入,这个注解修饰在我们需要测试的类上。必须要手动new一个实例,不然单元测试会有问题。...注解中指定,如本例中的@PrepareForTest({UserMapper.class})。...@PrepareForTest({ DateUtil.class}),其他的与普通方法的mock一样,再此就不在赘述了。
1.2 为什么需要Mock 测试驱动的开发( TDD)要求我们先写单元测试,再写实现代码。...如下图所示: 为了测试类A,我们需要Mock B类和C类(用虚拟对象来代替)如下图所示: 1.3 Stub和Mock异同 相同:Stub和Mock都是模拟外部依赖 不同:Stub是完全模拟一个外部依赖...; import org.powermock.core.classloader.annotations.PowerMockIgnore; import org.powermock.core.classloader.annotations.PrepareForTest...(bakWrapper); } } 要进行单元测试的类方法用 @InjectMocks private UserServiceImpl userService; 进行注入...不是真实的对象,它只是用类型的class创建了一个虚拟对象,并可以设置对象行为 Spy是一个真实的对象,但它可以设置对象行为 InjectMocks创建这个类的对象并自动将标记@Mock、@Spy等注解的属性值注入到这个中
所以我们在单测中,往往会使用mock的方式对这些代码做一个数据的模拟,从而达到对代码进行测试的一个目的。...,模拟对象方法的返回值,来完成mock。...; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4...; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4...; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4
1.2 为什么需要Mock 测试驱动的开发( TDD)要求我们先写单元测试,再写实现代码。...1.3 Stub和Mock异同 相同:Stub和Mock都是模拟外部依赖 不同:Stub是完全模拟一个外部依赖, 而Mock还可以用来判断测试通过还是失败 1.4 Mockito资源 官网: http...; import org.powermock.core.classloader.annotations.PowerMockIgnore; import org.powermock.core.classloader.annotations.PrepareForTest...(bakWrapper); } } 要进行单元测试的类方法用 @InjectMocks private UserServiceImpl userService; 进行注入...不是真实的对象,它只是用类型的class创建了一个虚拟对象,并可以设置对象行为 Spy是一个真实的对象,但它可以设置对象行为 InjectMocks创建这个类的对象并自动将标记@Mock、@Spy等注解的属性值注入到这个中
静态方法 Mock静态方法我们使用PowerMock结合Mockito的方案,首先在测试类增加如下注解: @RunWith(PowerMockRunner.class) @PowerMockRunnerDelegate...(Sputnik.class) @PrepareForTest([NewUtil.class, HttpBase.class]) @PowerMockIgnore(["javax.management....@SuppressStaticInitializationFor这个注解处理类的初始化,这个注解后面跟的是不需要进行初始化的类的包路径,在现在的实践中通常和@PrepareForTest后面的类是一致的...原因之前提过,主要是因为增加了类注解之后,Spock和Mockito一的Mock对象和定义方法的功能会无法运行,这个没找到具体的文档做出区分,所以如果遇到混合场景,建议使用PowerMock进行对象的Mock...使用语法上,就是混合了PowerMock处理静态和非静态资源,以及行为模拟的语法。
,首先使用@InjectMocks注解需要被注入的对象,如User,然后需要被依赖注入的对象使用@Mock或@Spy注解,之后Mockito 会自动完成注入过程,例如: @InjectMocks...PowerMock使用一个自定义类加载器和字节码操作来模拟静态方法,构造函数,final类和方法,私有方法,去除静态初始化器等等。...添加依赖: testImplementation 'org.powermock:powermock-module-junit4:2.0.2' testImplementation 'org.powermock...:powermock-module-junit4-rule:2.0.2' testImplementation 'org.powermock:powermock-api-mockito2:2.0.2'...,@PrepareForTest中指定静态方法所在的类,测试静态方法之前需要调用PowerMockito.mockStatic()方法来mock静态类,然后就通过when().thenReturn()方法指定静态方法的模拟返回值即可
Thread.sleep(500); } catch (InterruptedException e) { //e.printStackTrace(); break; } //end for j++; } } 为了模拟登陆请求未收到答复的场景...示例程序如下: import org.junit.Rule; import org.junit.Test; import org.mockito.Mockito; import org.powermock.core.classloader.annotations.PrepareForTest...; import org.powermock.modules.junit4.rule.PowerMockRule; import static org.powermock.api.mockito.PowerMockito.spy...demonstrate static mocking with PowerMockito. */ //@RunWith(PowerMockRunner.class) // using @Rule @PrepareForTest...InterruptedException()).when(Thread.class); Thread.sleep(Mockito.anyLong()); 当然,为了能够mock某个类的静态方法,需要在测试类上加上一下注解, @PrepareForTest
那么,我就要使用 EasyMock 来模拟 UserDAO 的返回值,并完成测试: import static org.easymock.EasyMock.*; import static org.junit.Assert...的时候,代码需要少许修改: import static org.powermock.api.easymock.PowerMock.*; @RunWith(PowerMockRunner.class...) @PrepareForTest(UserDAO.class) public class UserTest { private UserService userService;...verify(UserDAO.class); } } 相比前文,变化主要有这几个: 对于 org.easymock.EasyMock 的方法调用变成了 org.powermock.api.easymock.PowerMock...的方法调用; 使用了 RunWith 和 PrepareForTest 注解; 由于是静态方法,需要显示调用 mockStatic 方法来完成 mock 操作。
对象 Iterator iterator = mock(Iterator.class); // when...thenReturn / doReturn...when 模拟依赖调用...我们可以使用 @InjectMocks 注解创建实例并使用 mock 对象进行依赖注入。...这个时候我们就要用到 PowerMock,PowerMock 支持 JUnit 和 TestNG,扩展了 EasyMock 和 Mockito 框架,增加了mock static、final 方法的功能...首先需要引入 PowerMock 的依赖: <!...@RunWith(PowerMockRunner.class) @PrepareForTest({StringUtils.class}) public class UnitTest4 { @Test
(InterruptedException e) { e.printStackTrace(); }}}} // 测试用例 @RunWith( PowerMockRunner.class ) @PrepareForTest...https://stackoverflow.com/questions/5385161/powermock-testing-set-static-field-of-class static void setFinalStatic...newValue); } 通过 javap -verbose Consts.class 查看, //in-line ,请注意$jacocoInit,表示这段代码可以被jacoco打桩,而基础类型无法注入...powermock也一样。 ? image ?
领取专属 10元无门槛券
手把手带您无忧上云