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>