3

Spring で Maven マルチモジュール プロジェクトを単体テストしようとすると問題が発生します。

私は4つのモジュールを持っています:

application-core
application-data
application-service
application-web

これは私のテストであり、application-coreモジュール内にあります:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:/config/application-context.xml")
public class TicketTest {

    @Mock
    ITicketDAO ticketDAO;

    @Autowired
    @InjectMocks
    ITicketCore ticketCore;

    @Before
    public void init() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void testRegisterTicket_Ticket_NotUsed_isValid() {
        Long ticketNumber = 0L;
        when(ticketDAO.getTicket(anyLong())).thenReturn(null);
        final boolean isValidTicket = ticketCore.validateTicket(ticketNumber);
        assertTrue(isValidTicket);
    }

}

そして、ここに実装があります:

@Component
@Scope("prototype")
public class TicketCore implements ITicketCore{
    private ITicketDAO ticketDao;

    @Autowired
    public TicketCore(ITicketDAO ticketDao) {
        this.ticketDao = ticketDao;
    }

    @Override
    public boolean validateTicket(Long ticketNumber) {
        ITicket ticket = ticketDao.getTicket(ticketNumber);
        return ticket != null;
    }
}

インターフェース:

public interface ITicketDAO {
    ITicket getTicket(Long ticketNumber);
}

モジュールITicketDAOでの実装:application-data

@Service
public class TicketDAO implements ITicketDAO {
    @Override
    public ITicket getTicket(Long ticketNumber) {
        return null;  //To change body of implemented methods use File | Settings | File Templates.
    }
}

コンテキストで の実装が見つからないため、このコードのテストで問題が発生していますITicketDAO。テストが実行されているとき、JUnitはクラスパスに「他のモジュール」を入れることを気にしないので、それは明らかです。

BeanCreationException明らかな理由で春が投げられます。

私は正しいですか?

したがって、Spring がテストの邪魔をすることなくプロジェクトをテストしたいと思います。

問題なくテストを実行するにはどうすればよいですか???

テストフォルダー/パッケージにダミークラスを作成しましたが、動作しますが...

最終的には、application-coreモジュールのテスト フォルダーにすべての外部実装を配置します。

より良い方法はありますか?

前もって感謝します。

アップデート:

application-data
application-service
application-web

それらはすべて に依存しapplication-coreます。Spring は正常に注入されますTicketCore( application-core)。私が望むのはITicketDAO、テストを実行するためだけに注入する Spring の「何か」(ダミー クラス) を提供することです。

<beans>
    <context:component-scan base-package="ve.gov.imat.transimat" />
    <context:annotation-config />

    <aop:config proxy-target-class="true" />
</beans>
4

2 に答える 2

3

各 Maven モジュールが完全に個別のプロジェクトであると仮定します。その中に各モジュールのコードのテストを具体的に入れ、それらを実行するために必要なすべての依存関係が含まれているモジュールに統合テストを追加します。

モジュール間の依存関係に関する情報を提供していませんが、実行中の問題は、テスト目的でインターフェースの実装が必要であるように見えますが、実稼働 Bean は別のモジュールで定義されています。これが、EasyMock や Mockito などのモック フレームワークの目的です。それらを使用すると、具体的にテストできるように単純なプレースホルダー実装を作成できTicketCoreます。一度に 1 つのコンポーネントのみをテストしていることを確認できるように、実際の実装が利用可能な場合でもそれらを使用することをお勧めします。

ではTicketTest、 の Mockito モックを正しく定義してITicketDAOいますTicketCoreが、Bean を登録していなくても、Spring から Bean を自動取得しようとしています。Bean を手動でテスト コンテキストに登録するか、モックの定義を in に配置@Configurationsrc/testます。

于 2013-10-28T05:04:55.800 に答える