繁体   English   中英

如何将方法注入经过Java测试的类中?

[英]How to inject method into java tested class?

如何在不扩展测试类的情况下将方法(使用反射)注入超类? 我需要替换getExternalData()来测试someMethod()的逻辑。 我无法更改已测试的类-因此,我正在考虑注入方法。

我有流动的课程:

public class B extends A{
  public String someMethod(){
    String someString = super.getExternalData();
    //logic to be tested - manipulating on someString
    return someString;
  }
}

public class A{
  public String getExternalData(){
    //some Logic that generates "externalData" string
    return externalData;
  }
}

并测试:

public class CesTest{
  @Test
  public void someMethodTest()(
    B instance = new B();
    //...
    //...
    assertEquals("expectedData", instance.someMethod());
  }
}

简单的答案是,您不能不做一些真正奇怪的事情,这会导致您没有测试被测类,而是测试了类的一些奇怪的模拟版本。 您需要进行任何必要的设置,以使getExternalData返回适当的值。 就是说,应该以这样一种方式编写class A ,即可以注入一个mock以提供此外部external data而不会触及外部资源。

为什么使用

super.getExternalData()

而不仅仅是

getExternalData()

这将使您扩展B并覆盖getExternalData()

public class B extends A{
  public String someMethod(){
    String someString = getExternalData(); //without 'super'
    //logic to be tested - manipulating on someString
    return someString;
  }
  @Override
  public String getExternalData(){
    //Overriding code
    return externalData;
  }
}

public class A{
  public String getExternalData(){
    //some Logic that generates "externalData" string
    return externalData;
  }
}

这对你有帮助吗?

(对我的英语感到抱歉)

嗨Marcin,

我在4月11日10:55回答了您,但是,在上了junit课程之后,如果您还没有解决,我有更好的解决方案:

首先,按照惯例,必须使用后缀“ Test”(在您的情况下为BTest)将TestClass称为SUT(被测对象)。

其次,在JUnit中常常使用Mock类来更改Collaborators方法(Collaborator是导致与SUT依赖的类)。 更好的选择是使用Google Code的Mockito(一种免费的,更好的jUnit API)。 使用:

public class BTest{
  @Test
  public void someMethod()(
    B instance = new B();
    when(instance.getExternalData()).thenReturn("expectedData");
    assertEquals("expectedData", instance.someMethod());
  }
}

http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html Google代码规则! 如果可行,请投票给我,谢谢

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM