저는 민첩한 관행을 따르고 있으며 숙제도 있습니다. 과정 중에 FIT를 사용하여 자동화 된 수락 테스트를 수행하는 방법에 대해 배웠습니다. 내가 볼 수있는 것부터 FIT가 죽어가는 것 같아서 숙제로 사용하려는 기술이 더 이상 확실하지 않습니다. 어쨌든 ...레거시 코드 수락 수락
나는 테스트 할 레거시 시스템이 있으며 모든 것이 잘못 설계/코딩되어 있습니다. 물론 테스트는 없으며 수용 테스트를 작성하기 전에 리팩토링하거나 기능을 변경할 수 없습니다.
간단히하기 위해 제품 목록 (가격 포함)과 총 비용을 표준 출력 스트림에 인쇄하는 상점 영수증 시스템이라고 가정 해 보겠습니다. 이런 식으로 뭔가 :
public class ReceiptSystem
{
List<Product> boughtProducts = new ArrayList<Product>();
public void buyProduct(Product p)
{
boughtProducts.add(p);
}
public void printReceipt()
{
List<ReceiptLine> receipt = new ArrayList<ReceiptLine>();
int total = 0;
int price;
for(List<Product> boughtProducts : boughtProduct)
{
price = SomeThirdPartyClass.calculatePrice(boughtProduct.getBarcode());
System.out.println(boughtProduct + ": " + price);
total += price;
}
System.out.println("TOTAL: " + total);
}
}
문제는 가격이 외부 라이브러리와 타사 시스템에 의해 계산되는, 그래서 내가 그들을 모르는 내가 어려운 (불가능하지는 않더라도) 수용을 작성 찾아 FIT를 사용하여 테스트하십시오. 가격을 모른 채
------------------
| receipt |
------------------
| 111111111: 1.99 |
------------------
| 123456789: 2.99 |
------------------
| 987654321: 3.99 |
------------------
| 999999999: 4.99 |
------------------
| TOTAL: 13.96 |
------------------
그러나이 어떻게 이것을 달성 할 수
쇼핑 목록 (입력) :
-------------------
| product's barcode |
-------------------
| 111111111 |
-------------------
| 123456789 |
-------------------
| 987654321 |
-------------------
| 999999999 |
-------------------
영수증 (예상 출력) 정상적인 경우에는 내가 좋아하는 뭔가를 할 것입니다 ? 채택하기에 가장 좋은 전략은 무엇입니까? 이것을 달성하기위한 다른 프레임 워크가 있습니까?
감사합니다.
업데이트 :SomeThirdPartyClass
는, final
입니다 그것은 다음과 같은 오류 줄 것이다에 대한 프록시 클래스를 작성을 조롱하거나 시도 :
Cannot subclass final class class SomeThirdPartyClass
또한, 불변의 대중 생성자는 인수가 없습니다합니다. 교사가 의도적으로 만든 것처럼 보입니다.
감사합니다. @ GarrettHall. 바로 그것이 실제 상황에서 내가 할 일입니다. 그러나 어떤 코드를 작성하기 전에 어떤 식 으로든 코드를 변경하는 것은 허용되지 않습니다. 숙제 요구 사항의 일부입니다 ... – satoshi
다음 출력을 캡처하고 그로부터 회귀 테스트를 만듭니다. FITnesse는 체크 아웃하고자하는 FIT의 업데이트 된 버전이지만 JUnit은 잘 작동합니다. –
나는 @GrerettHall에 동의한다. [Mockito] (http://code.google.com/p/mockito/)와 같은 조롱 프레임 워크를 사용하여 타사 라이브러리의 응답을 시뮬레이션 할 수 있습니다. 예. 'Mockito.when (SomeThirdPartyLibrary.calculatePrice ("11111111")). thenReturn ("1.9938); ' – radimpe