java - 如果测试运行正常,为什么我会收到反射异常 NoSuchMethodException

标签 java reflection junit mocking private-methods

我正在使用反射来模拟私有(private)方法(我不想讨论这是否有意义)。

有人知道为什么吗?我将在这里提供我的 testClass 源代码,它可能会有所帮助。我已经尝试了很多互联网帮助和方法来解决这个问题,但没有一个对我有用。

public class testProtexManagerProcessRequiredFile {

  @Mock
  ProtexManager PxManager;


  @Before
  public void inicializa() {
    MockitoAnnotations.initMocks(this);
  }

  @Test
  public void processRequiredFileTest() throws ClassNotFoundException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException, InstantiationException {

    Method method;
    try {
      method = ProtexManager.class.getDeclaredMethod("processRequiredFile", File.class);
      method.setAccessible(true);

      File FileExample = new File();
      String NameExample = "Nome";
      File outputs = new File();
      outputs = (File) Mockito.when(method.invoke(PxManager, FileExample,NameExample)).thenReturn(FileExample);
      assertNotNull(outputs);
      assertEquals(outputs, method.invoke(PxManager, FileExample,NameExample));
    } catch (NoSuchMethodException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
   System.out.println("Teste Concluido."); 
  }
}

这就是方法代码:

 private File processRequiredFile(File file, String name) {
    if (!file.exists()) {
      this.message = name + " file not found at location: " + file;
      this.msgResponse.addMsgList(MsgCode.FAILURE, MsgLevel.ERROR, this.message, StringUtils.EMPTY);
    }
    return file;
  }

感谢大家帮助我解决疑问。

最佳答案

回答你的问题,

因为您捕获了NoSuchMethodException。要获得测试失败,您必须在测试执行期间以某种方式获得一些异常或错误

<小时/>

为了跟进评论,以下是测试此方法的方法:

// let's assume there are getter for this.message / this.msgResponse 
// and this method is in the class foo.bar.Foobar
protected File processRequiredFile(File file, String name) {
    if (!file.exists()) {
      this.message = name + " file not found at location: " + file;
      this.msgResponse.addMsgList(MsgCode.FAILURE, MsgLevel.ERROR, this.message, StringUtils.EMPTY);
    }
    return file;
}

在测试类中foo.bar.FoobarTest:

@Mock
private File file;

private Foobar foobar = new Foobar(); 

@Test
public void testWithNonExistingFile() {
    Mockito.when(this.file.exists()).thenReturn(false); // this is to illustrate, you could also use some non existent file: new File("/does-not-exists.foo")
    File result = this.foobar.processRequiredFile(this.file, "some name");
    assertThat(result).isEqualTo(this.file);
    assertThat(foobar.getMsgResponse()).isNotEmpty(); // TODO: better assertion
    assertThat(foobar.getMessage()).isEqualTo( "some name file not found at location: " + this.file);
}

@Test
public void testWithExistingFile() {
    Mockito.when(this.file.exists()).thenReturn(true);
    File result = this.foobar.processRequiredFile(this.file, "some name");
    assertThat(result).isEqualTo(this.file);
    assertThat(foobar.getMsgResponse()).isEmpty();
    assertThat(foobar.getMessage()).isNull();
}

被测试的类(即Foobar)经过真正的测试,它使用它的真实实例并调用它的方法。模拟用于替换我们没有的东西(这里是一个文件来说明,但通常是更复杂的东西)

关于java - 如果测试运行正常,为什么我会收到反射异常 NoSuchMethodException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46117252/

相关文章:

testing - 我们什么时候应该使用@InjectMocks?

intellij-idea - Junit 无法在 Play 中处理 SBT! Intellij 14 上的框架项目

java - 我的 Keylistener 不起作用,我想知道原因

java - 选择打印机(带对话框)打印 .xls 文件到

java - `Class.getDeclaredClasses()` 返回的数组中的元素是否有任何特定顺序?

vb.net - 仅反射(reflect) VB.NET 上派生类的子属性

java - AspectJ:如何替换现有注释

java - 如何使用正则表达式查找字符串是否至少有一个字符?

Java 树集 : remove and contains() not working

java - 使用反射 : how to test method