2017-08-05 50 views
0

我想模拟一个对象及其自动装配的构造函数依赖项之一。如何模拟spring bean及其autowired ctor参数?

例如为:

class MyTest { 
    @MockBean A a; 
    @Test myTest() { 
    assertTrue(when(a.some()).thenCallRealMethod()); 
    } 
} 
@Component 
class A { 
    private B b; 
    A(B dependency) { 
    this.b = dependency; 
    } 
    boolean some() { 
    return b.value(); 
    } 
} 
@Configuration 
class B { 
    boolean value() { return true; } 
} 

,这将抛出一个NPE时a::some被称为MyTest::myTest。 我该如何嘲笑嘲笑依赖关系?

回答

1

首先,你要选择的亚军,

SpringRunner或的Mockito亚军

在这种情况下,我选择了SpringRunner: 文档:https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/test/context/junit4/SpringRunner.html

然后创建了一个MockBean和您必须定义模拟行为

when(a.some()).thenReturn(true);

@RunWith(SpringRunner.class) 
    public class MyTest { 

     @MockBean A a; 

     @Test 
     public void myTest() { 
      when(a.some()).thenReturn(true); 
      assertTrue(a.some()); 

     } 
     @Component 
     class A { 
      private B b; 
      A(B dependency) { 
      this.b = dependency; 
      } 
      boolean some() { 
      return b.value(); 
      } 
     } 
     @Configuration 
     class B { 
      boolean value() { return true; } 
     } 

    } 

使用@SpyBean测试实方法:对甲

@RunWith(SpringRunner.class) 
@SpringBootTest(classes={MyTest.class,MyTest.B.class,MyTest.A.class}) 
public class MyTest { 

    @SpyBean A a; 

    @Test 
    public void myTest() { 

     assertTrue(a.some()); 

    } 
    @Component 
    class A { 
     private B b; 
     A(B dependency) { 
     this.b = dependency; 
     } 
     boolean some() { 
     return b.value(); 
     } 
    } 
    @Configuration 
    class B { 


     boolean value() { return true; } 
    } 

} 

间谍和嘲笑B.将象下面这样:

@RunWith(SpringRunner.class) 
@SpringBootTest(classes={MyTest.class,MyTest.B.class,MyTest.A.class}) 
public class MyTest { 

    @SpyBean A a; 

    @MockBean B b; 

    @Test 
    public void myTest() { 

     when(b.value()).thenReturn(false); 
     assertTrue(a.some()); 

    } 
    @Component 
    class A { 
     private B b; 
     A(B dependency) { 
     this.b = dependency; 
     } 
     boolean some() { 
     return b.value(); 
     } 
    } 
    @Configuration 
    class B { 


     boolean value() { return true; } 
    } 

} 

结果:断言故障为B的嘲笑行为是错误的。

+0

对不起,我在添加失踪的时候再打电话。我想打电话给A,然后委托给B的真正方法。我也想模拟B. B是一些配置。 – mrt181

+0

如果你想调用实际的方法,然后使用@SpyBean。我已经更新了我的答案。 – Barath