3

ここで説明されているように、Springockito を使用して Spring コンテキスト ファイルでモックを作成する場合、その動作をモックするにはどうすればよいですか?

私がやろうとしていること:

  1. ClassA がテストされています。
  2. ClassB は ClassA で自動配線されます。
  3. ClassB は Springockito で嘲笑されています。
  4. ClassA は、PostConstruct で何かを行うために ClassB を必要とします。
  5. ClassB をモックして何かを行う必要があります。

Springockito を使用せずに (Mockito を直接使用して) これを行うのは簡単ですが、これらの Bean を自動配線し、テストで Spring を使用する必要があります。どんな助けでも大歓迎です。

4

3 に答える 3

3

新しい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
    }

}

これにより、メイン アプリケーション コンテキストの初期化時に ClassB がモックに置き換えられます。

于 2013-10-21T14:33:43.350 に答える
2

私はSpringockitoに精通していませんが、いくつかの狭いケース、つまり、少しだけモックを使用した統合テストでは面白そうです。

とにかく、AbstractJUnit4SpringContextTestsを拡張する単純なユースケースのように見えますが、ClassAの場合と同じように、テストでClassBを自動配線することもできます。次に、セットアップメソッドでClassBの予想される動作を定義できます。

ただし、setupメソッドでClassB Beanにアクセスする前に、ClassBBeanの動作を設定する必要があると思います。その場合、期待される動作を実行するためにClassBをセットアップするために別のBeanが必要になる場合があります。したがって、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を手動でコーディングする方が簡単ではありませんか?

于 2012-06-21T04:20:35.093 に答える