0

如何在不扩展测试类的情况下将方法(使用反射)注入超类?我需要更换 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());
  }
}
4

4 回答 4

1

简单的答案是你不能不做一些非常奇怪的事情,这会导致你不测试被测类,而是一些奇怪的被测类的模拟版本。您需要进行任何设置以getExternalData返回适当的值。话虽这么说,class A应该写成这样,mock可以注入 a 来提供它external data而不会碰到外部资源。

于 2012-04-11T10:54:12.497 回答
0

(对不起我的英语)

嗨,马尔辛,

我在 4 月 11 日 10:55 回答了你,但是,在我上完 junit 课后,我有一个更好的解决方案,如果你还没有解决它:

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

其次,在JUnit 中经常是使用Mock Classes 来改变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谷歌代码规则!如果可行,请投票给我的答案,谢谢

于 2012-05-14T12:44:35.720 回答
0

为什么使用

super.getExternalData()

而不仅仅是

getExternalData()

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

于 2012-04-11T10:54:53.377 回答
0
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;
  }
}

这对你有帮助吗?

于 2012-04-11T10:55:56.707 回答