单元测试,如何创建MockObject?

barcaisrio 2020-11-08 11:15:25
请检查一下以下代码,一个无限循环,ASK要求输入VALID值,但我们不给
需要创建MockObject才能读取AskCode,否则用户必须手动输入数据。 之后,必须检查它是否有效或必须再次发出请求。
问题:
Mock Objects
用户可以参与测试吗? (扫描数据)
我们如何使assertEquals用于数据数组?


package MasterMindTQSProject;

import static org.junit.Assert.*;

import org.junit.Test;

public class GameTest {
MockMyScanner sc = new MockMyScanner();
MyScanner nsc = new MyScanner();
Game game = new Game(sc);

@Test
public void testAskNumTriesDefault() {
int testTries = 10;
assertEquals(testTries,game.getTries());
}

@Test
public void testAskNumTriesCustomized() {
int testTries = 15;
game.sc.setNewInt(15);
game.proxyAskTries();
assertEquals(testTries,game.getTries());
}

@Test
public void testSelectModeDefault() {
int testLengthTest = 5;
int testMinValue = 1;
int testTries = 10;

game.sc.setNewInt(1); //Game mode

game.selectMode();
assertEquals(testLengthTest, game.secretWord.getWord_length());
assertEquals(testMinValue, game.secretWord.getMin_number());
assertEquals(testTries, game.getTries());
}

@Test
public void testSelectModeCustomized() {
int testLengthTest = 4;
int testMinValue = 5;
int testTries = 15;

game.sc.setNewInt(2); //Game mode
game.sc.setNewInt(testLengthTest); //WordLength
game.sc.setNewInt(testMinValue); //MinValue
game.sc.setNewInt(testTries); //Tries
game.selectMode();

assertEquals(testLengthTest, game.secretWord.getWord_length());
assertEquals(testMinValue, game.secretWord.getMin_number());
assertEquals(testTries, game.getTries());
}

//@Test
//我们发现一个无限循环,因为ASK要求输入VALID值,而我们不给它们
/* *需要创建MockObject才能读取AskCode,否则用户必须手动输入数据。 之后,必须检查它是否有效或必须再次发出请求。
问题:
Mock Objects
用户可以参与测试吗? (扫描数据)
我们如何使assertEquals用于数据数组?*/

public void testInsertCode() {
int []testCode = {1,2,3,4,5};
int []testCodeError1 = {1,2,8,4,5};
int []testCodeError2 = {1,2,3,4,5,4};
int []testCodeError3 = {1,2,3,4};
int []testCodeError4 = {1,2,3,4,-9};


String mockCode = "1 2 3 4 5";
game.sc.setNewCode(mockCode);
game.askCode();
for (int i = 0; i < 5; i++) {
assertEquals(testCode[i], game.getCodeTry()[i]);
}

mockCode = "1 2 8 4 5";
game.sc.setNewCode(mockCode);
game.askCode();
for (int i = 0; i < 5; i++) {
assertNotEquals(testCode[i], game.getCodeTry()[i]);
}

mockCode = "1 2 3 4 5 4";
game.sc.setNewCode(mockCode);
game.askCode();
for (int i = 0; i < 5; i++) {
assertNotEquals(testCode[i], game.getCodeTry()[i]);
}


mockCode = "1 2 3 4";
game.sc.setNewCode(mockCode);
game.askCode();
for (int i = 0; i < 5; i++) {
assertNotEquals(testCode[i], game.getCodeTry()[i]);
}

mockCode = "1 2 3 4 -9";
game.sc.setNewCode(mockCode);
game.askCode();
for (int i = 0; i < 5; i++) {
assertNotEquals(testCode[i], game.getCodeTry()[i]);
}
}

/*//@Test
public void testInsertCodeRangeDefault() {
int codeOK[] = new int [] {1,2,3,4,5};
int codeNotOKLow[] = new int [] {1,2,3,4,5,6};
int codeNotOKHigh[] = new int [] {1,2,3,4,5,6};
game.codeInRange(code);
assertEquals(code.size,game.secretWord.getWord_length());
}

//@Test
public void testInsertCodeRangeCustomized() {
game.codeInRange();
assertEquals(code.size,game.secretWord.getWord_length());
}

//@Test
public void testInsertCodeLengthDefault() {
int codeOK[] = new int [] {1,2,3,4,5};
int codeNotOKLow[] = new int [] {1,2,3,4,5,6};
int codeNotOKHigh[] = new int [] {1,2,3,4,5,6};
game.codeInRange(code);
assertEquals(code.size,game.secretWord.getWord_length());
}

//@Test
public void testInsertCodeCustomized() {
int codeOK[] = new int [] {1,2,3,4,5};
int codeNotOKLow[] = new int [] {1,2,3,4,5,6};
int codeNotOKHigh[] = new int [] {1,2,3,4,5,6};
game.codeInRange(code);
assertEquals(code.size,game.secretWord.getWord_length());
}*/


@Test
public void testCorrectPosition() {
int correctPosition;
String testCode = "1 2 3 4 5";

game.sc.setNewCode(testCode);
game.askCode();
game.secretWord.setMin_number(1);
game.secretWord.setWord_length(5);
int[] gameCode = {1,2,3,4,5};
game.secretWord.setSecretWord(gameCode);

correctPosition = game.getNumbersCorrectPosition();
assertEquals(5, correctPosition);


int[] gameCode2 = {1,2,3,4,4};
game.secretWord.setSecretWord(gameCode2);

correctPosition = game.getNumbersCorrectPosition();
assertEquals(4, correctPosition);

}

@Test
public void testAproxNumbers() {
int correctPosition;

String testCode = "1 2 3 4 5";
game.sc.setNewCode(testCode);
game.askCode();
game.secretWord.setMin_number(1);
game.secretWord.setWord_length(5);
int[] gameCode = {1,3,3,2,5};
game.secretWord.setSecretWord(gameCode);

correctPosition = game.getAproxNumbers();
assertEquals(2, correctPosition);


int[] gameCode2 = {1,4,5,2,5};
game.secretWord.setSecretWord(gameCode2);

correctPosition = game.getAproxNumbers();
assertEquals(3, correctPosition);
}

}

...全文
4288 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
barcaisrio 2020-11-11
  • 打赏
  • 举报
回复
抱歉我不是很明白,因为我们写了一个这么一个函数:
public void selectMode() {
		int mode = 0;
		 do{
			System.out.println("Choose an option ");
			System.out.println("[1] Default mode");
			System.out.println("[2] Customized mode");
			System.out.print("Option selected: ");
			//this.sc = new Scanner(System.in);
			
			mode = sc.nextInt();
			switch(mode) {
			case 1: 
				this.secretWord = new SecretWord();
				this.secretWord.generateSecretWord(this.secretWord.getWord_length(), this.secretWord.getMin_number());
				break;
			case 2:
				int length;
				int minValue;
				System.out.print("Insert the length of the secret word: ");
				length = sc.nextInt();
				System.out.print("Insert the minimum value of the secret word: ");
				minValue = sc.nextInt();
				this.secretWord = new SecretWord(length,minValue);
				askTries();
				this.secretWord.generateSecretWord(length, minValue);
				break;
			default:
				System.out.print("This is not a correct option");
				break;
				
			}
		}while(mode != 1 && mode != 2);
		
	}
就是不知道怎么知道生成的SecretWord是来自哪里,不知道怎么才能手动输入?
qybao 2020-11-09
  • 打赏
  • 举报
回复
用户参与测试,那就是测试程序和用户交互呗
具体不知道你的用户想怎么参与测试,就你的代码而言,你可以把String mockCode = "1 2 3 4 5"; 以下的代码让用户自己输入
Scanner usc = new Scanner();
System.out.println("请输入测试数据:") ;
String mockCode = usc.nextLine(); //让用户自己输入数据

至于assertEquals用于数据数组,方法很多,处理你自己用循环的方式,还可以把数组转成String来比较,或者转成集合用集合的containsAll方法之类的
比如,转成String的方式
assertEquals(Arrays.toString(testCode), Arrays.toString(game.getCodeTry()));




qybao 2020-11-09
  • 打赏
  • 举报
回复
引用 3 楼 barcaisrio 的回复:
请问上面通过mock Object,不调用generateSecretWord的问题能帮忙回答一下吗?谢谢

【我们考虑自己引入秘密字】你这个秘密字是怎么来的?你要先弄清楚generateSecretWord后生成的密码字保存在哪里,然后用你自己的密码字替换自动生成的密码字不就好了吗?
比如
int[] gameCode = {1,3,3,2,5};
game.secretWord.setSecretWord(gameCode); //推测可能这里会调用generateSecretWord生成密码字,那它的结果保存在哪?如果保存在game.secretWord的话你直接改掉game.secretWord就好了。或者如果你知道generateSecretWord方法和int[] gameCode = {1,3,3,2,5};的关系,把gameCode参数改成你期待的值就好了。


barcaisrio 2020-11-09
  • 打赏
  • 举报
回复
引用 2 楼 qybao 的回复:
用户参与测试,那就是测试程序和用户交互呗
具体不知道你的用户想怎么参与测试,就你的代码而言,你可以把String mockCode = "1 2 3 4 5"; 以下的代码让用户自己输入
Scanner usc = new Scanner();
System.out.println("请输入测试数据:") ;
String mockCode = usc.nextLine(); //让用户自己输入数据

至于assertEquals用于数据数组,方法很多,处理你自己用循环的方式,还可以把数组转成String来比较,或者转成集合用集合的containsAll方法之类的
比如,转成String的方式
assertEquals(Arrays.toString(testCode), Arrays.toString(game.getCodeTry()));
请问上面通过mock Object,不调用generateSecretWord的问题能帮忙回答一下吗?谢谢
barcaisrio 2020-11-09
  • 打赏
  • 举报
回复
我们想测试Master Mind游戏的一些连接。使用模拟对象来扫描那些必须引入的变量,因此我们知道用户的所有动作。但是对于此测试,我们还必须知道程序生成的秘密字,因此我们考虑自己引入秘密字,但是我们不知道如何使程序通过模拟对象不调用generateSecretWord函数来对其进行介绍。

58,454

社区成员

发帖
与我相关
我的任务
社区描述
Java Eclipse
社区管理员
  • Eclipse
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧