3

メソッド呼び出しを介してオブジェクトを構成し、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、 のさまざまなインスタンスによってログに記録されますStoregetしたがって、 I は値 Iではありませんset

サーバーとテストで同じ Spring コンテキストを表示するにはどうすればよいですか?

4

0 に答える 0