12

@Autowiredオブジェクトを Mockito モック オブジェクトに置き換えようとしています。これを行う通常の方法は、Springockito を使用して xml を使用することでした。

<mockito:mock id="SomeMock" class="com.package.MockInterface" />

現在、私はSpringのJavaConfigを使用して仕事をしようとしています。突然、Java 式は xml よりもはるかに冗長になります。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class MyTestClass {

    @Configuration
    static class Config {
        @Bean
        public MockInterface somethingSpecial() {
            return Mockito.mock(MockInterface.class);
        }
    }

    @Autowired MockInterface mockObj;

    // test code
}

Springockito-annotations というライブラリを発見しました。これにより、次のことが可能になります。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader=SpringockitoContextLoader.class)
public class MyTestClass {

    @Autowired @ReplaceWithMock MockInterface mockObj;

    // test code
}

明らかに、はるかにきれいです :) 唯一の問題は、このコンテキスト ローダーでは他の Bean に JavaConfig を使用できないことです@Configuration(そうすると、Spring はそれらの自動配線されたフィールドに一致する候補がないと文句を言います)。

Spring の JavaConfig と Springockito-annotations をうまく機能させる方法を知っていますか? または、モックを作成するための別の省略形はありますか?

おまけとして、Springockito と xml 構成を使用して、依存関係 (存在する場合) にオートワイヤー候補を提供することなく、具体的なクラスをモックアウトすることができました。これはxmlなしでは不可能ですか?

4

3 に答える 3

4

現在メンテナンスされていない (この記事を書いている時点で) Spingockito アノテーションから離れて Mockito に移行すると、これを非常に簡単に行う方法があります。

@RunWith(MockitoJUnitRunner.class)
@ContextConfiguration
public class MyTestClass {

    @Mock MockInterface mockObj;

    // test code
}

実際のオブジェクトを使用しているが、その中の依存関係をモックしたい場合、たとえば DAO でサービス レイヤーをテストする場合:

@RunWith(MockitoJUnitRunner.class)
@ContextConfiguration
public class MyTestClass {

    @InjectMocks RealService;

    @Mock MockDAO mockDAO;

    // test code
}

setUp()最後に、これは Spring-boot にも適用できますが、複数のクラス ランナーがサポートされるまではアノテーションの初期化を使用します。

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = MyMainSpringBootClass.class)
public class MyTestClass {

    @InjectMocks RealService;

    @Mock MockDAO mockDAO;

    @Before
    public final void setUp() throws Exception{
        MockitoAnnotations.initMocks(this);
    }

    // test code
}
于 2015-08-06T14:19:24.613 に答える
2

時代遅れで非推奨!

Spring Boot 1.4 でのモックとスパイについて読む

@ethesx の回答もお読みください 。Springockitoは保守されていません

古い答え

これにより、 Springockito-annotationsを使用して XML ファイルなしで Spring アプリケーションをモックできるようになりました。このソリューションはSpring Bootでも機能します。

import static org.mockito.BDDMockito.*;
import org.kubek2k.springockito.annotations.*;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = Application.class, 
     loader = SpringockitoAnnotatedContextLoader.class)
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
public class MainControllerTest {

    @Autowired
    MainController mainController;

    @Autowired
    @ReplaceWithMock
    FooService fooService;

    @Test
    public void shouldGetBar() {
        //given
        given(fooService.result("foo")).willReturn("bar");

        //when
        Bar bar build = fooService.getBar("foo");

        //then
        assertThat(bar).isNotNull();
    }
}

依存関係: org.kubek2k:springockito-annotations:1.0.9

于 2014-01-11T22:43:53.630 に答える
1

次のように記述されているGenericXmlContextLoaderSpringockitoContextLoader拡張しているようです。

XML リソースから Bean 定義を読み取る AbstractGenericContextLoader の具体的な実装。

そのため、現時点では xml Bean 定義に制限されています。

SpringockitoContextLoaderクラスから関連する部分を取得して、独自のコンテキストローダーを作成できます。開始するには、こちらをご覧ください。たとえば、AnnotationConfigContextLoaderを拡張できますか?

于 2013-02-19T15:05:16.130 に答える