当父级在不同的包中时模拟受保护的父级方法

编程入门 行业动态 更新时间:2024-10-25 09:24:53
本文介绍了当父级在不同的包中时模拟受保护的父级方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我需要在我的测试类的父类中模拟一个受保护的方法,但父类位于不同的包中,因此我的测试类无法访问该方法,因此我无法模拟它.这个问题必须有一个无需重构的解决方案

I need to mock a protected method in the parent class of my class under test but the parent class is in a different package so my test class cannot access that method so I cannot mock it. There's gotta be a solution for this issue without refactoring

我需要使用 Powermock 和 Mockito.这是 JAR

I need to use Powermock and Mockito. Here's the JARs

  • mockito-all 1.10.8
  • powermock-core 1.6.1
  • powermock-module-junit4 1.6.1
  • powermock-api-mockito 1.6.1
  • junit 4.12

这是遗留代码,所以我无法重构,但这是简化的代码.

This is legacy code so I cannot refactor, but here's the simplified code.

Parent.java

package parent; public class Parent { // Want to mock this protected parent method from different package protected String foo() { String someValue = null; // Logic setting someValue return someValue; } }

Child.java

package child; import parent.Parent; public class Child extends Parent { String fooString = null; public String boo() { this.fooString = this.foo(); String booString = null; // Logic setting booString return booString; } }

ChildTest.java

package child; import static org.mockito.Mockito.spy; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import parent.Parent; @RunWith(PowerMockRunner.class) @PrepareForTest({ Parent.class, Child.class }) public class ChildTest { // Class Under Test Child cut; @Before public void setUp() throws Exception { // Partial mock to mock methods in parent class cut = spy(new Child()); } @Test public void testBoo() { // TODO: Need to mock cut.foo() but can't figure out how. // Following gives me this error: The method foo() from the type Parent is not visible Mockito.when(((Parent)cut).foo()).thenReturn("mockValue"); // Test cut.boo(); // Validations Assert.assertEquals(cut.fooString, "mockValue"); } }

推荐答案

你可以使用 PowerMock 来模拟没有公共方法.

You can use PowerMock to mocking no public method.

@RunWith(PowerMockRunner.class) public class ChildTest { @Test public void testBoo() throws Exception { //given Child child = PowerMockito.spy(new Child()); PowerMockito.when(child, "foo").thenReturn("mockValue"); //when String boo = child.boo(); //then Assert.assertEquals("boo+mockValue", boo); } }

更多推荐

当父级在不同的包中时模拟受保护的父级方法

本文发布于:2023-10-31 06:36:01,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1545308.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:中时   方法

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!