实验内容:
信用卡号是一串长度介于13和16之间的一串数字。卡号必须是以4、5、6、或37开头,并遵循下面模式:
1) 从卡号最后一位数字开始,偶数位乘以2,如果乘以2的结果是两位数,那么就将这两位数加在一起得到一位数。
2) 将第一步所得到的所有一位数相加
3) 从卡号最后一位数字开始,奇数位数字相加
4) 将第二步和第三步的到的结果相加
5) 如果第四步得到的结果能被10整除,那么卡号是合法的,否则,卡号是不合法的。
package org.test;import java.util.Scanner;public class CreditCard { /** Return true if the card number is valid */ public boolean isValid(long number) { return (getSize(number) >= 13) && (getSize(number) <= 16) && (prefixMatched(number, 4) || prefixMatched(number, 5) || prefixMatched(number, 6) || prefixMatched(number, 37)) && (sumOfDoubleEvenPlace(number) + sumOfOddPlace(number)) % 10 == 0; } /** Get the result from Step 2 */ public int sumOfDoubleEvenPlace(long number) { int result = 0; number = number / 10; // Starting from the second digit from left while (number != 0) { result += getDigit((int)((number % 10) * 2)); number = number / 100; // Move to the next even place } return result; } /** Return this number if it is a single digit, otherwise, return * the sum of the two digits */ public int getDigit(int number) { return number % 10 + (number / 10); } /** Return sum of odd place digits in number */ //3) 从卡号最后一位数字开始,奇数位数字相加 public int sumOfOddPlace(long number) { int result = 0; while (number != 0) { result += (int)(number % 10); number = number / 100; // Move two positions to the left } return result; } /** Return true if the digit d is a prefix for number */ public boolean prefixMatched(long number, int d) { return getPrefix(number, getSize(d)) == d; } /** Return the number of digits in d */ public int getSize(long d) { int numberOfDigits = 0; while (d != 0) { numberOfDigits++; d = d / 10; } return numberOfDigits; } /** Return the first k number of digits from number. If the number * of digits in number is less than k, return number. */ public long getPrefix(long number, int k) { long result = number; for (int i = 0; i < getSize(number) - k; i++) result /= 10; return result; }}
参数化 && 覆盖率100% 测试设计:
package org.test;import static org.junit.Assert.*;import java.util.Arrays;import java.util.Collection;import org.junit.After;import org.junit.AfterClass;import org.junit.Assert;import org.junit.Before;import org.junit.BeforeClass;import org.junit.Test;import org.junit.runner.RunWith;import org.junit.runners.Parameterized;import org.junit.runners.Parameterized.Parameters;@RunWith(Parameterized.class) public class CreditCardTest { CreditCard creditCard; private long input; private int sumOfOddPlaceExpected; private int digitExpected; private int sumOfDoubleEvenPlaceExpected; private boolean isValidExpected; @Parameters @SuppressWarnings("unchecked") public static Collection prepareData1(){ Object[][] object = { {4111111111111111L,8,8,22,true}, {38520000023237L,21,3,19,false}, {6011000000000004L,5,5,5,true}, {100000000L,1,1,0,false}, {10000000000000000L,1,1,0,false}, {371449635398431L,33,6,47,true}, {5111111111111198L,15,6,22,false} }; return Arrays.asList(object); } public CreditCardTest(long input,int sumOfOddPlaceExpected,int digitExpected, int sumOfDoubleEvenPlaceExpected,boolean isValidExpected){ this.input = input; this.sumOfOddPlaceExpected = sumOfOddPlaceExpected; this.digitExpected = digitExpected; this.sumOfDoubleEvenPlaceExpected = sumOfDoubleEvenPlaceExpected; this.isValidExpected = isValidExpected; } @Before public void setUp() throws Exception { creditCard = new CreditCard(); } //检验信用卡号 @Test public void testIsValid() { boolean result = creditCard.isValid(input); Assert.assertEquals(isValidExpected,result); } //从卡号最后一位数字开始,偶数位乘以2,如果乘以2的结果是两位数,那么就将这两位数加在一起得到一位数。 @Test public void testSumOfDoubleEvenPlace() { int result = creditCard.sumOfDoubleEvenPlace(input); Assert.assertEquals(result, sumOfDoubleEvenPlaceExpected); } //如果两位数,那么就将这两位数加在一起得到一位数,否则返回本身 @Test public void testGetDigit() { int result = creditCard.getDigit(sumOfOddPlaceExpected); Assert.assertEquals(digitExpected, result); } //3)从卡号最后一位数字开始,奇数位数字相加 @Test public void testSumOfOddPlace() { int result = creditCard.sumOfOddPlace(input); Assert.assertEquals(sumOfOddPlaceExpected,result); }}