Kodkata.com bünyesinde hazırladığım Koşullu Mantığın Komut İle Değiştirilmesi isimli katada aşağıda yer alan birim testlerinden yola çıkılarak, uygulama yeniden yapılandırılıyor.
[source language=”java”]
package com.kodkata.kata.replaceConditionalDispatcherWithCommand.orig;
import junit.framework.Assert;
import org.junit.Test;
public class PriceCalculatorTest {
private static final String LOCALE_TURKISH_REPUBLIC = "tr_TR";
private static final int DEFAULT_NETTO_PRICE = 100;
private static final String LOCALE_GERMANY = "de_DE";
private static final String LOCALE_AUSTRIA = "at_AT";
@Test
public void shouldCalculatePriceForGermanLocale() throws Exception {
Assert.assertTrue(new Order().calculatePrice(LOCALE_GERMANY, DEFAULT_NETTO_PRICE) == 119);
}
@Test
public void shouldCalculatePriceForTurkishLocale() throws Exception {
Assert.assertTrue(new Order().calculatePrice(LOCALE_TURKISH_REPUBLIC, DEFAULT_NETTO_PRICE) == 118);
}
@Test
public void shouldCalculatePriceForAustrianLocale() throws Exception {
Assert.assertTrue(new Order().calculatePrice(LOCALE_AUSTRIA, DEFAULT_NETTO_PRICE) == 120);
}
}
[/source]
Uygulamadan olan beklentilerimi ifade etmek için assertTrue() metodunu kullandım. İlk bakışta bu beklentilerin neyi ifade ettiğini anlamak kolay değil. Assertj çatısını kullanarak, DSL (Domain Specific Language) bazlı bir assert oluşturabiliriz. Bu DSL bazlı assert sınıfını kullandığımız taktirde testleri aşağıdaki şekilde yapılandırmak mümkün olacaktır.
[source language=”java”]
package com.kodkata.kata.replaceConditionalDispatcherWithCommand.orig;
import static com.kodkata.kata.replaceConditionalDispatcherWithCommand.orig.OrderAssert.assertThat;
import org.junit.Test;
public class PriceCalculatorTest {
private static final String LOCALE_TURKISH_REPUBLIC = "tr_TR";
private static final int DEFAULT_NETTO_PRICE = 100;
private static final String LOCALE_GERMANY = "de_DE";
private static final String LOCALE_AUSTRIA = "at_AT";
private final Order order = new Order();
@Test
public void shouldCalculatePriceForGermanLocale() throws Exception {
assertThat(order)
.inCountry(LOCALE_GERMANY)
.withPrice(DEFAULT_NETTO_PRICE)
.hasTotalPrice(119);
}
@Test
public void shouldCalculatePriceForTurkishLocale() throws Exception {
assertThat(order)
.inCountry(LOCALE_TURKISH_REPUBLIC)
.withPrice(DEFAULT_NETTO_PRICE)
.hasTotalPrice(118);
}
@Test
public void shouldCalculatePriceForAustrianLocale() throws Exception {
assertThat(order)
.inCountry(LOCALE_AUSTRIA)
.withPrice(DEFAULT_NETTO_PRICE)
.hasTotalPrice(120);
}
}
[/source]
Şimdi ilk bakışta testlerin daha kolay okunur yapıda olduğunu düşünüyorum. Oluşturduğum OrderAssert sınıfı şu yapıda:
[source language=”java”]
package com.kodkata.kata.replaceConditionalDispatcherWithCommand.orig;
import org.assertj.core.api.AbstractAssert;
import org.assertj.core.api.Assertions;
public class OrderAssert extends AbstractAssert<OrderAssert, Order> {
private String locale;
private int price;
private OrderAssert(final Order actual) {
super(actual, OrderAssert.class);
}
public static OrderAssert assertThat(final Order actual) {
return new OrderAssert(actual);
}
public OrderAssert hasTotalPrice(final int total) {
isNotNull();
Assertions.assertThat(actual.calculatePrice(locale, price)).isEqualTo(total);
return this;
}
public OrderAssert inCountry(final String locale) {
this.locale = locale;
return this;
}
public OrderAssert withPrice(final int price) {
this.price = price;
return this;
}
}
[/source]
EOF (End Of Fun)
Özcan Acar