テストユニットを起動して実行しようとしていて、奇妙な問題が発生しました。私のアプリケーションは、起動時に操作を実行するために@Componentとして注釈が付けられたApplicationListenerクラスを使用します。テスト中にSpringブートのApplicationListener @Componentを除外します
テスト中、私はロジックを含むサービスを嘲笑しましたが、Mockitoの命令がコントローラスコープでうまく動作しても、BeanはこのApplicationListenerクラスのために初期化されません。サービスの各メソッドから返されるデータ型に応じて、falseまたはnullのいずれかを返します。
ApplicationListenerクラスのテストユニットから模擬サービスを初期化する方法が見つからないため、除外することにしました。これを行うために、私はテストアプリケーションのコンテキストを作成し、その設定を変更するのに最も頻繁に使用される方法で、さまざまなアプローチを試みました。残念ながら、私が見たことは何も働いていないので、私はここで助けを求めています。可能であれば、私はApplicationListenerクラスに触れず、テストコード内のすべての関連するコーディングを行いたいと考えています。
、彼らが行うことができる場合、私は、2つの解決策のいずれかに興味を持っています:
1.- ApplicationListenerの実行中に嘲笑の挙動を取得しますが、私はこれを行うことができないことをどこかで読んだことが
2.テストユニットから何か@componentを除外します。
TestUnit.Java:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = TestApplication.class, webEnvironment = WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc
public class TestConfigurationService {
private MockMvc mockMvc;
@Autowired
private WebApplicationContext webApplicationContext;
@MockBean
private MockService mockService;
private void initMockBean() throws Exception {
when(mockService.isDoingSomething()).thenReturn(true);
}
@Before
public void setup() throws Exception {
// Spring mock context application setup
this.mockMvc = webAppContextSetup(webApplicationContext).build();
// Initialize ConsulService mock bean
initMockBean();
}
}
TestApplication.java
@SpringBootApplication
@EnableAutoConfiguration
@ComponentScan(basePackages="my.base.package", excludeFilters = @Filter(type = FilterType.ASSIGNABLE_TYPE, classes = StartupConfiguration.class))
public class TestApplication {
public static void main(String[] args) {
SpringApplication.run(TestApplication.class, args);
}
}
コードに示されているもの以外にも、私はまた、ファイルTestApplication.javaでこの注釈を試してみました:
@SpringBootApplication(exclude={StartupConfiguration.class})
StartupConfiguration.java
@Component
public class StartupConfiguration implements ApplicationListener<ContextRefreshedEvent> {
@Autowired
private ConfigurationService configurationService;
@Override
public void onApplicationEvent(final ContextRefreshedEvent event) {
try {
configurationService.updateConfiguration();
} catch (Exception e) {
throw new RuntimeException ("Error", e);
}
}
}
ConfigurationService.java
public interface ConfigurationService {
public void updateConfiguration() throws Exception;
}
ConfigurationServiceImpl.java
@Service
@Transactional
public class ConfigurationServiceImpl implements ConfigurationService {
@Autowired
private MService mockService;
@Override
public void updateConfiguration() throws Exception {
if (mockService.isDoingSomething()==false)
throw new Exception ("Something went wrong");
}
}
バージョン:
春ブーツ1.5.4.RELEASE、
のJava 1.8
私はあなたが持っている問題についてちょっと混乱しています...テスト中にSpringが 'StartupConfiguration'を初期化したくないという問題はありますか? –
TestのためにStartupConfigurationがロードされていないので、リスナーがまったく実行されないようにする必要があります。 – Rittmann
もう1つの選択肢は、trueを返すようにアプリケーションリスナーを嘲笑するかもしれませんが、起動時に内部mockedサービスがその瞬間に初期化されなかった場合、私の推測では、それを嘲笑することもできません。しかし、それが可能であれば、それはうまくいくでしょう。 – Rittmann