簡體   English   中英

如何模擬Springockito模擬的行為?

[英]How to mock behavior for Springockito mocks?

如果我在使用Springockito描述我的Spring上下文文件創建一個模擬在這里 ,我怎么嘲笑為它的一些行為?

我正在嘗試做什么:

  1. ClassA正在測試中。
  2. ClassB在ClassA中自動裝配。
  3. ClassB正在被Springockito嘲笑。
  4. ClassA需要ClassB在其PostConstruct中做一些事情。
  5. 我需要模擬ClassB才能做到這一點,因為它不能也不應該真的這樣做。

在沒有使用Springockito(直接使用Mockito)的情況下這樣做是直截了當的,但我需要自動裝配這些bean並在我的測試中使用Spring。 任何幫助表示贊賞。

請注意,新的springockito-annotations有助於實現相同的目標,而不會弄亂xml上下文和額外的幫助程序類:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader = SpringockitoContextLoader.class, locations = "classpath:test-config.xml")
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
public class MemoAutoTest extends AbstractJUnit4SpringContextTests {

    @Autowired
    private ClassA classA;
    @Autowired @ReplaceWithMock
    private ClassB classB;

    @Test
    public void testClassA() {
        // stub B 
        when(classB.foo()).thenReturn(true);
        when(classB.bar()).thenReturn(42);

        // test A
    }

}

這將導致在主應用程序上下文初始化時用mock替換ClassB。

我對Springockito並不熟悉,但對於一些狹隘的案例來說它看起來很有趣 - 即集成測試只是一點點嘲弄。

無論如何,對於一個簡單的用例,你可以擴展AbstractJUnit4SpringContextTests ,你也可以在你的測試中自動裝配ClassB,就像在ClassA中一樣。 然后,您可以在setup方法中定義ClassB的預期行為。

但我認為您需要在設置方法中訪問它之前為ClassB bean設置一些行為。 在這種情況下,您可能需要另一個bean來設置ClassB以執行預期的行為。 所以你的testContext.xml會有這樣的東西:

<bean id="classA" class="com.jarvis.ClassA" depends-on="classBMockSetter" />
<mockito:mock id="classB" class="com.jarvis.ClassB" />
<bean id="classBMockSetter" class="com.jarvis.test.ClassBMockSetter">
  <property name="classB" ref="classB" />
</bean>

ClassBMockSetter看起來像:

public class ClassBMockSetter {
  private ClassB classB;
  public void setClassB(ClassB classB) {
    this.classB = classB;
    given(classB.foo()).willReturn(true);
    given(classB.bar()).willReturn(42);
  }
}

我認為這樣可行,但在那時,手動編寫你的模擬ClassB是不是更容易?

對我有用的是使用@InjectMocks表示法。 (見https://bitbucket.org/kubek2k/springockito/wiki/Home

@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(loader = SpringockitoContextLoader.class,locations =“classpath:test-config.xml”)@ DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)public class MemoAutoTest extends AbstractJUnit4SpringContextTests {

@Autowired
private ClassA classA;
@Autowired @InjectMocks
private ClassB classB;

@Test
public void testClassA() {
    // stub B 
    when(classB.foo()).thenReturn(true);
    when(classB.bar()).thenReturn(42);

    // test A
    classA.doSomethingThatInternallyCallClassBFoo();
}

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM