【问题标题】:doNothing void method with params in other classdoNothing void 方法与其他类中的参数
【发布时间】:2015-09-30 15:52:22
【问题描述】:

我目前有 2 个课程:

public class aClass{
   public void meth1(){
      bClass b = new bClass();
      b.meth2();// i dont want to call this method
      //buss logic
   }
}

public class bClass{
   public void meth2(){
      // some logic
   } 
}

目前我正在为aClass 中的meth1 创建一个junit 测试用例。 但是,我不想调用bClass中的meth2,只需执行aClass中的busslogic即可。

aClassbClass 类是固定的 - 我不能(也不会)更改 aClassbClass 上的代码。

我使用 mokito 和 power mock 尝试了很多东西,例如 @injectmock 和 doNothing,但是当我在 aClass 中调用 meth1 时,总是会调用 meth2

我能做些什么来解决这个问题?

【问题讨论】:

    标签: junit mockito powermock easymock


    【解决方案1】:

    You can do this with Powermockito。该链接解释了所有细节。以下是您的示例的外观。

    @RunWith(PowerMockRunner.class)
    @PrepareForTest(aClass.class)
    public class aClassTesting {
    
        @Mock
        bClass mockB;
    
    
        @Test
        public void testMeth1(){
    
            //prepare mocks
            whenNew(bClass.class).withNoArguments().thenReturn(mockB);
            doNothing().when(mockB).meth2();
    
            //run it
            aClass instance = new aClass();
            aClass.meth1();
    
            //asserts and verify
            verifyNew(bClass.class).withNoArguments();
            verify(mockB, times(1)).meth2();
        }
    
    }
    

    编辑:

    当您使用 @Mock 模拟 bClass 实例时,它会用模拟方法替换该实例中的所有方法。如果您只想模拟 bCLas 中的某些方法,那么您必须监视 bCLass 实例而不是模拟它。 Spy 只模拟你想要的方法。因此,在我的示例中,只需将 @Mock 替换为 @Spy,那么只会阻止 meth2 而不会阻止 bClass 中的任何其他方法。

    【讨论】:

    • --您好感谢您的回复...该解决方案效果很好,但我还有另一个问题。我在 bClass 类中有另一种方法说 meth3。我还使用相同的实例在 meth1 中调用方法 meth3。上面的解决方案同时阻止了 meth2 和 meth3...但我只阻止了 meth2..doNothing 部分不起作用...您能告诉我这个问题的解决方案吗..
    • 是的,我做到了,它按预期工作...感谢 agin 提供解决方案...
    【解决方案2】:

    就目前而言,在不能更改 AClass 的约束下,唯一的解决方案是使用 Powermock(或类似工具)as Jose Martinez mentioned above。就其本身而言,Mockito 无法替换构造函数(被视为静态方法调用),因此您唯一的解决方案是重写 aClass。

    对于任何发现此问题且不受此限制的未来读者,bClass 的快速重构将使测试变得更容易。

    public class aClass{    
       public void meth1(){
          meth1(new bClass());
       }
    
       /** Package private for testing. */
       public void meth1(bClass b){
          b.meth2();
          //buss logic
       }
    }
    

    此时,您可以传递一个mock bClass,并调用单参数重载来测试您的业务逻辑。如果b.meth2() 的行为更像是设置调用,您还可以将b.meth2() 从单参数方法中移到公共无参数方法中。

    【讨论】:

      【解决方案3】:

      你可以使用mockito...

      public class aClass {
          private final bClass b;
      
          public aClass() {
              this.b = new bClass()    
          }
      
          public aClass(bClass b) {
              this.b = b;
          }
      
          ....
      }
      
      @RunWith(MockitoJUnitRunner.class)        
      public class aClassTest {
      
          @Mock
          private final bClass b;
      
          @InjectMocks
          private aClass a;
      
          ....
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-21
        • 1970-01-01
        • 1970-01-01
        • 2015-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多