如何使用powermock捕获函数输入?

时间:2016-11-10 16:41:12

标签: dictionary mapreduce hbase powermock powermockito

假设我有以下测试功能:

var result = "#"
while(result.length <=7 ){
console.log(result);
result = result + "#";
}
VM920:3 #
VM920:3 ##
VM920:3 ###
VM920:3 ####
VM920:3 #####
VM920:3 ######
VM920:3 #######
"########"

请注意,context.write是一个写入数据库的函数。

我想模拟该函数并检查传递给它的输入是否正确。我该怎么做?

基本上,我可以做类似下面的事情(我似乎无法开始工作):

boolean MyFunction (String input1, Text rowkey) {
   int a = 10;
   a = a + 10;
   return context.write(rowkey,a);
}

2 个答案:

答案 0 :(得分:1)

你不应该这样做!

假设 context 是封闭类的字段,那么您“只需”找到提供模拟版本的方法这样的上下文对象对你正在测试的类。

这里的典型方式:依赖注入

像:

public class Foo {
   private final Context context;

   // some external constructor that you would use to create Foo objects
   public Foo() { this (new Context(...)); }

   // an internall ctor, used by your unit tests
   Foo(Context context) { this.context = context;  }

然后,您可以编写单元测试,例如

@Test
public void testMyFunction() {
  Context context = ... create some mock
  Foo underTest = new Foo(context);
  underTest.myFunction(...

使用上述方法,您对强力模拟的全部需求消失了。您可以使用“普通”模拟框架(如Mokito或EasyMock)来准备/验证您的上下文对象!

您最后看到的问题是,您创建的代码只是 hard 进行测试,除非您开始考虑依赖注入。如果您认真考虑测试,请观看这​​些videos;它们为您提供了如何实际创建可测试代码的广泛介绍。

答案 1 :(得分:0)

这是我自己解决的解决方案,并且在我需要的时候完美运行。我在没有mrunit帮助的情况下使用这种技术有效地测试了所有map-reduce代码。

@Test
public void testMyFunction () throws Exception {
   Context testContext = mock(Context.class);
   MyFunction (input1, rowkey); // Call the function under test
   // Now here is the magic. We use the verify technique to test 
   // the mocked class method while checking for equality with the acceptance criteria.
   // In essence, the key is trap these underlying functions and ensure that
   // they are passed in the right input from your function under test.
   int expected_input_to_write = 10
   Mockito.verify(testContext).write(eq((Object) new Text("test_string")), eq((Object) expected_input_to_write )); 
}