メソッド呼び出しを介してオブジェクトを構成し、HTTP 要求を使用してオブジェクトに対してテストを実行できるように、環境をセットアップしようとしています (半疑似コード):
myStore.addCustomer("Jim")
HttpResponse response = httpClient.get("http://localHost/customer/Jim")
assertThat(response.status, is(OK))
(または JBehave で)
Given a customer named Jim
When I make an HTTP GET to path "customer/Jim"
Then the response is 200 OK
そして、Spring Boot を使用して Web サービスを実装したいと考えています。
しかし、私の試みはきれいに見えますが、うまくいきません。なぜなら、私のテスト オブジェクトによって見られる Spring コンテキストは、Web サービスによって使用される Spring コンテキストと同じではないからです。
私の環境は Serenity+JBehave ですが、原則はそのままの jUnit と変わらないことを願っています。
私は持っている:
@RunWith(SerenityRunner.class)
@SpringApplicationConfiguration(classes = Application.class )
@WebAppConfiguration
@IntegrationTest
public class AcceptanceTestSuite extends SerenityStories {
@ClassRule
public static final SpringClassRule SPRING_CLASS_RULE = new SpringClassRule();
@Rule
public final SpringMethodRule springMethodRule = new SpringMethodRule();
@Autowired
private Store store;
}
...そしてアプリケーションコード:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
...そして、共有したいオブジェクトのクラス:
@Component
public class Store {
private String id;
private final Logger log = LoggerFactory.getLogger(Store.class);
public Store() {
log.info("Init");
}
public void addCustomer(String id) {
this.id = id;
log.info("Store " + this + " Set id " + id);
}
public String getCustomerId() {
log.info("Store " + this + " Return id " + id);
return id;
}
}
...私のコントローラーで:
@RestController
public class LogNetController {
@Autowired Store store;
@RequestMapping("/customer/{name}")
public String read(name) {
return ...;
}
}
...そして私のSerenityステップクラスでは:
@ContextConfiguration(classes = Application.class)
public class TestSteps extends ScenarioSteps {
@Autowired Store store;
@Step
public void addCustomer(String id) {
store.addCustomer(id);
}
}
テストを実行すると、サーバーが起動し、setter が実行され、HTTP 要求が行われます。でも
- 「Init」が
Store
コンストラクターによって 2 回ログに記録されていることがわかります。1 つはテストに関連付けられた Spring コンテキストによって作成され、もう 1 つは Tomcat コンテナーに属する Spring コンテキストによって作成されます。 Set
私はそれを見ることができReturn
、 のさまざまなインスタンスによってログに記録されますStore
。get
したがって、 I は値 Iではありませんset
。
サーバーとテストで同じ Spring コンテキストを表示するにはどうすればよいですか?