- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在进行单元测试。我们的项目正在与 Play!框架。单元测试是用 Java 编写的。我们的团队遇到了一个问题,即我们遇到了使用 @RunWith(PowerMockRunner.class) 注解并扩展另一个类的测试类的重复测试运行。
我们的测试类主要设置如下:
单元测试工具:包含各种测试用例之间共享的功能。还包含常用字段。
@Ignore
@RunWith(PowerMockRunner.class)
@PrepareForTest(SomeStaticClass.class)
public abstract class UnitTestHarness {
//Bunch of setup code...
}
测试类:包含我们正在测试的类的测试用例。
public class TestClass extends UnitTestHarness {
@Test
public void testSomething(){
//Perform some tests...
}
}
如您所见,TestClass 扩展了具有注释的 UnitTestHarness。当 TestClass 通过 play "test-only"命令运行时,将返回以下输出:
[info] somepackage.TestClass
[info] + testSomething
[info]
[info]
[info] Total for test somepackage.TestClass
[info] Finished in 0.055 seconds
[info] 1 tests, 0 failures, 0 errors
[info] somepackage.TestClass
[info] + testSomething
[info]
[info]
[info] Total for test somepackage.TestClass
[info] Finished in 0.001 seconds
[info] 4 tests, 0 failures, 0 errors
[info] Passed: Total 4, Failed 0, Errors 0, Passed 4
[success] Total time: 18 s, completed Apr 16, 2014 4:19:37 PM
显然,由于某种原因,测试运行了两次。我在网上读到 @RunWith 注释和扩展类存在一些问题,但我一直无法找到解决方案。我觉得值得注意的是,如果我将注释从 UnitTestHarness 移动到 TestClass,将返回以下输出:
[info] somepackage.TestClass
[info]
[info]
[info] Total for test somepackage.TestClass
[info] Finished in 0.032 seconds
[info] 0 tests, 0 failures, 0 errors
[info] somepackage.TestClass
[info] + testSomething
[info]
[info]
[info] Total for test somepackage.TestClass
[info] Finished in 0.025 seconds
[info] 4 tests, 0 failures, 0 errors
[info] Passed: Total 4, Failed 0, Errors 0, Passed 4
[success] Total time: 13 s, completed Apr 16, 2014 4:47:28 PM
在本例中,我们可以看到它仍在尝试运行某种测试,但实际上并未运行额外的 4 个测试,因为 UnitTestHarness 没有注释。我猜测这是因为在第一个示例中,注释被放置在 UnitTestHarness 上并由 TestClass 继承,但在本示例中,只有 TestClass 具有注释,因此测试仅针对该特定类运行。
还有其他人看到过这个问题吗?显然,我们可以应对第二种情况,但理想情况下根本不应该进行运行这些类的额外尝试。这是 PowerMockRunner 或 Play 框架的问题吗?当我运行 mvn clean install 或 play test 来运行整个测试套件时,测试也会运行两次。任何可能的解决方案或建议将非常感激。非常感谢大家的帮助。
建议的解决方案#1:注入(inject) UnitTestHarness
我能够通过使用 MockitoAnnotations.initMocks(this); 让它们不要运行两次;而不是你提到的注释。当您使用注释时,测试仍然运行两次。我尝试使用所描述的方法,但在使用和不使用注释的情况下都遇到了各种问题。
1)这似乎不是 @InjectMocks 的正确使用方式。我已经使用了该注释,它实际上是在您模拟了字段并希望将其注入(inject)另一个具有该类型字段的对象时使用的。
2) 我发现,当以这种方式注入(inject)时,UnitTestHarness 中的模拟行为不会转移。我们的单元测试工具设置了当前的 Http.Context,这不会传输到我们的测试用例。事实上,使 UnitTestHarness 有用的许多初始化需要转移到 TestClass 本身中的 @Before 方法中,这违背了我认为首先拥有该工具的目的。
3) 我们在工具中拥有和使用的所有方法都必须公开以便可访问,并通过工具实例或 TestClass 本身中的静态调用来访问。我们还需要将工具中的字段公开,或者为其中的大多数创建更改器(mutator)。
总的来说,我认为这不是解决我们遇到的问题的好方法,但我很欣赏你的想法。
最佳答案
您是否尝试使用注释@InjectMocks将UnitTestHarness注入(inject)TestClass并在@Before注释的方法中调用所有必要的方法?请记住,当您使用@InjectMocks时,您还需要在类名上方添加@RunWith(MockitoJUnitRunner.class)。 Here是一些例子。
避免继承始终是一个不错的选择。
编辑:
在我看来,问题不在图书馆。我写了一些代码,它工作正常:
public final class ClassWithStaticMethods {
public static String returnString(){
return "Sample text";
}
}
@RunWith(PowerMockRunner.class)
@PrepareForTest(ClassWithStaticMethods.class)
public class UnitTestHarness {
private String field1 = "field1";
private String field2 = "field2";
@Before
public void setUp() {
PowerMockito.mockStatic(ClassWithStaticMethods.class);
when(ClassWithStaticMethods.returnString()).thenReturn("This static method is mocked!");
}
public List<String> createList() {
List<String> list = Lists.newArrayList();
list.add("firstElement");
list.add("secondElement");
list.add("thirdElement");
return list;
}
public Point dummyPoint() {
return new Point(2, 3);
}
public String getField1() {
return field1;
}
public void setField1(String field1) {
this.field1 = field1;
}
public String getField2() {
return field2;
}
public void setField2(String field2) {
this.field2 = field2;
}
}
public class TestClass extends UnitTestHarness {
private List<String> list;
private Point dummyPoint;
@Before
public void setup() {
list = createList();
dummyPoint = dummyPoint();
}
@Test
public void testSomething() {
System.out.println("First test method. Value of field1 from UnitTestHarness is: " + getField1());
setField1("New value");
System.out.println("First test method. Value of field1 from UnitTestHarness is: " + getField1());
}
@Test
public void testSomethingElse() {
System.out.println("Second test method. Value of field2 from UnitTestHarness is: " + getField2());
}
@Test
public void testStaticMockMethod() {
System.out.println(ClassWithStaticMethods.returnString());
}
@Test
public void testDummyPoint() {
System.out.println(String.format("My point: %s, %s", dummyPoint.getX(), dummyPoint.getY()));
}
@Test
public void testArray() {
for (String string : list) {
System.out.println("Array element:" + string);
}
}
}
这是我的控制台输出:
Running service.TestClass
Array element:firstElement
Array element:secondElement
Array element:thirdElement
First test method. Value of field1 from UnitTestHarness is: field1
First test method. Value of field1 from UnitTestHarness is: New value
Second test method. Value of field2 from UnitTestHarness is: field2
This static method is mocked!
My point: 2.0, 3.0
Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.442 sec
Results :
Tests run: 5, Failures: 0, Errors: 0, Skipped: 0
如果没有这个问题的更广泛背景,很难提出更具体的建议,也许您应该在此类中添加更多代码?
关于java - 带有 @RunWith(PowerMockRunner.class) 注释的测试类在扩展另一个类时运行测试用例两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23120014/
SQLite、Content provider 和 Shared Preference 之间的所有已知区别。 但我想知道什么时候需要根据情况使用 SQLite 或 Content Provider 或
警告:我正在使用一个我无法完全控制的后端,所以我正在努力解决 Backbone 中的一些注意事项,这些注意事项可能在其他地方更好地解决......不幸的是,我别无选择,只能在这里处理它们! 所以,我的
我一整天都在挣扎。我的预输入搜索表达式与远程 json 数据完美配合。但是当我尝试使用相同的 json 数据作为预取数据时,建议为空。点击第一个标志后,我收到预定义消息“无法找到任何内容...”,结果
我正在制作一个模拟 NHL 选秀彩票的程序,其中屏幕右侧应该有一个 JTextField,并且在左侧绘制弹跳的选秀球。我创建了一个名为 Ball 的类,它实现了 Runnable,并在我的主 Draf
这个问题已经有答案了: How can I calculate a time span in Java and format the output? (18 个回答) 已关闭 9 年前。 这是我的代码
我有一个 ASP.NET Web API 应用程序在我的本地 IIS 实例上运行。 Web 应用程序配置有 CORS。我调用的 Web API 方法类似于: [POST("/API/{foo}/{ba
我将用户输入的时间和日期作为: DatePicker dp = (DatePicker) findViewById(R.id.datePicker); TimePicker tp = (TimePic
放宽“邻居”的标准是否足够,或者是否有其他标准行动可以采取? 最佳答案 如果所有相邻解决方案都是 Tabu,则听起来您的 Tabu 列表的大小太长或您的释放策略太严格。一个好的 Tabu 列表长度是
我正在阅读来自 cppreference 的代码示例: #include #include #include #include template void print_queue(T& q)
我快疯了,我试图理解工具提示的行为,但没有成功。 1. 第一个问题是当我尝试通过插件(按钮 1)在点击事件中使用它时 -> 如果您转到 Fiddle,您会在“内容”内看到该函数' 每次点击都会调用该属
我在功能组件中有以下代码: const [ folder, setFolder ] = useState([]); const folderData = useContext(FolderContex
我在使用预签名网址和 AFNetworking 3.0 从 S3 获取图像时遇到问题。我可以使用 NSMutableURLRequest 和 NSURLSession 获取图像,但是当我使用 AFHT
我正在使用 Oracle ojdbc 12 和 Java 8 处理 Oracle UCP 管理器的问题。当 UCP 池启动失败时,我希望关闭它创建的连接。 当池初始化期间遇到 ORA-02391:超过
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve
引用这个plunker: https://plnkr.co/edit/GWsbdDWVvBYNMqyxzlLY?p=preview 我在 styles.css 文件和 src/app.ts 文件中指定
为什么我的条形这么细?我尝试将宽度设置为 1,它们变得非常厚。我不知道还能尝试什么。默认厚度为 0.8,这是应该的样子吗? import matplotlib.pyplot as plt import
当我编写时,查询按预期执行: SELECT id, day2.count - day1.count AS diff FROM day1 NATURAL JOIN day2; 但我真正想要的是右连接。当
我有以下时间数据: 0 08/01/16 13:07:46,335437 1 18/02/16 08:40:40,565575 2 14/01/16 22:2
一些背景知识 -我的 NodeJS 服务器在端口 3001 上运行,我的 React 应用程序在端口 3000 上运行。我在 React 应用程序 package.json 中设置了一个代理来代理对端
我面临着一个愚蠢的问题。我试图在我的 Angular 应用程序中延迟加载我的图像,我已经尝试过这个2: 但是他们都设置了 src attr 而不是 data-src,我在这里遗漏了什么吗?保留 d
我是一名优秀的程序员,十分优秀!