Mở rộng câu trả lời của David, người mà tôi hoàn toàn đồng ý với việc bạn nên tạo một trình bao bọc cho Ngẫu nhiên. Tôi đã viết khá nhiều câu trả lời tương tự về nó trước đó trong một câu hỏi tương tự vì vậy đây là "phiên bản ghi chú của Cliff".
Điều bạn nên làm là trước tiên tạo trình bao bọc dưới dạng giao diện (hoặc lớp trừu tượng):
public interface IRandomWrapper {
int getInt();
}
Và lớp cụ thể cho điều này sẽ trông như thế này:
public RandomWrapper implements IRandomWrapper {
private Random random;
public RandomWrapper() {
random = new Random();
}
public int getInt() {
return random.nextInt(10);
}
}
Nói rằng lớp học của bạn là như sau:
class MyClass {
public void doSomething() {
int i=new Random().nextInt(10)
switch(i)
{
//11 case statements
}
}
}
Để sử dụng IRandomWrapper một cách chính xác, bạn cần sửa đổi lớp của mình để lấy nó làm thành viên (thông qua hàm tạo hoặc trình cài đặt):
public class MyClass {
private IRandomWrapper random = new RandomWrapper(); // default implementation
public setRandomWrapper(IRandomWrapper random) {
this.random = random;
}
public void doSomething() {
int i = random.getInt();
switch(i)
{
//11 case statements
}
}
}
Bây giờ bạn có thể kiểm tra hành vi của lớp mình với trình bao bọc, bằng cách chế nhạo trình bao bọc. Bạn có thể làm điều này với một khung mô phỏng, nhưng điều này cũng dễ thực hiện:
public class MockedRandomWrapper implements IRandomWrapper {
private int theInt;
public MockedRandomWrapper(int theInt) {
this.theInt = theInt;
}
public int getInt() {
return theInt;
}
}
Vì lớp học của bạn mong đợi một cái gì đó trông giống như một IRandomWrapper
bây giờ, bạn có thể sử dụng cái bị chế giễu để ép buộc hành vi trong bài kiểm tra của bạn. Dưới đây là một số ví dụ về các bài kiểm tra JUnit:
@Test
public void testFirstSwitchStatement() {
MyClass mc = new MyClass();
IRandomWrapper random = new MockedRandomWrapper(0);
mc.setRandomWrapper(random);
mc.doSomething();
// verify the behaviour for when random spits out zero
}
@Test
public void testFirstSwitchStatement() {
MyClass mc = new MyClass();
IRandomWrapper random = new MockedRandomWrapper(1);
mc.setRandomWrapper(random);
mc.doSomething();
// verify the behaviour for when random spits out one
}
Hi vọng điêu nay co ich.