toomanymethodsfoundexception

ejk8hzay  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(887)

重新生产的步骤,
使用受保护的方法创建一个类,并在子类中重写相同的方法。
为子类创建一个测试,并尝试抑制方法调用 throws TooManyMethodsFoundException .
测试接口.java

  1. package com.test.powermock;
  2. /**
  3. * Created by dineshkumar on 06/05/16.
  4. */
  5. public interface TestInterface {
  6. public int testMethod() throws Exception;
  7. }

抽象测试.java

  1. package com.test.powermock;
  2. /**
  3. * Created by dineshkumar on 06/05/16.
  4. */
  5. public abstract class AbstractTest implements TestInterface {
  6. public int testMethod() throws Exception {
  7. return 0;
  8. }
  9. protected void voidMethodWithParams(String a) throws Exception{
  10. }
  11. }

implclasstest.java文件

  1. package com.test.powermock;
  2. /**
  3. * Created by dineshkumar on 06/05/16.
  4. */
  5. public class ImplClassTest extends AbstractTest {
  6. @Override
  7. public int testMethod() throws Exception {
  8. voidMethodWithParams("a");
  9. return 2;
  10. }
  11. @Override
  12. protected void voidMethodWithParams(String a) throws Exception{
  13. System.out.println("dd");
  14. }
  15. }

implclasstesttest.java文件

  1. package com.test.powermock;
  2. import org.powermock.api.mockito.PowerMockito;
  3. import static org.powermock.api.support.membermodification.MemberMatcher.method;
  4. import static org.powermock.api.support.membermodification.MemberModifier.suppress;
  5. import static org.testng.Assert.*;
  6. /**
  7. * Created by dineshkumar on 06/05/16.
  8. */
  9. public class ImplClassTestTest {
  10. @org.testng.annotations.Test
  11. public void testTestMethod() throws Exception {
  12. ImplClassTest implClassTestSpy = PowerMockito.spy(new ImplClassTest());
  13. suppress(method(ImplClassTest.class, "voidMethodWithParams", String.class));
  14. int res = implClassTestSpy.testMethod();
  15. assertEquals(res, 2);
  16. }
  17. }

在谷歌之后,https://groups.google.com/forum/#!主题/powermock/h1u5yyexqfy
还尝试了以下代码,

  1. package com.test.powermock;
  2. import org.powermock.api.mockito.PowerMockito;
  3. import static org.powermock.api.support.membermodification.MemberMatcher.method;
  4. import static org.powermock.api.support.membermodification.MemberModifier.suppress;
  5. import static org.testng.Assert.*;
  6. /**
  7. * Created by dineshkumar on 06/05/16.
  8. */
  9. public class ImplClassTestTest {
  10. @org.testng.annotations.Test
  11. public void testTestMethod() throws Exception {
  12. ImplClassTest implClassTestSpy = PowerMockito.spy(new ImplClassTest());
  13. suppress(method(AbstractTest.class, "voidMethodWithParams", String.class));
  14. suppress(method(ImplClassTest.class, "voidMethodWithParams", String.class));
  15. int res = implClassTestSpy.testMethod();
  16. assertEquals(res, 2);
  17. }
  18. }

有什么方法可以抑制这些方法吗?

wydwbb8l

wydwbb8l1#

重新描述问题:
使用powermock suppress + method() 无法正确获取 @Overriden protected 方法:voidmethodwithparams,因为问题 TooManyMethodsFoundException ,找到类中存在的两个方法 ImplClassTest 以及 AbstractTest 问题:找到两种方法!powermock不知道该抑制哪一个。

  1. // encounter TooManyMethodsFoundException !!!
  2. suppress(method(AbstractTest.class, "voidMethodWithParams", String.class));

解决方法:这个问题肯定难看,用java原创的方式 foo.class.getMethod() (仅公开)或 bar.class.getDeClaredMethod() (受保护和私人)

  1. // "voidMethodWithParams" is protected method use getDeclaredMethod()
  2. suppress(ImplClassTest.class.getDeclaredMethod("voidMethodWithParams", String.class))
  3. // "publicMethod" use getMethod()
  4. suppress(ContainPublicMethodClass.class.getMethod("publicMethod", foo.class))

ps:如果您想在一个类中抑制所有方法,请使用powermock的 methodsDeclaredIn() ```
import static org.powermock.api.support.membermodification.MemberMatcher.methodsDeclaredIn;
suppress(methodsDeclaredIn(AbstractTest.class))

展开查看全部

相关问题