Android 使用.setText()对方法进行单元测试
我尝试在我的android项目中对一个方法进行单元测试。 我尝试在文本视图上设置一个值。 是否可以跳过一行代码,还是必须将其实现为UI测试 这是我尝试测试的方法:Android 使用.setText()对方法进行单元测试,android,unit-testing,Android,Unit Testing,我尝试在我的android项目中对一个方法进行单元测试。 我尝试在文本视图上设置一个值。 是否可以跳过一行代码,还是必须将其实现为UI测试 这是我尝试测试的方法: public int compareEnteredValue(int batterySize, double valueFromEntry, double batteryArray[]) { int output = 0; for (int i = 0; i <= batteryArray.length - 1;
public int compareEnteredValue(int batterySize, double valueFromEntry, double batteryArray[]) {
int output = 0;
for (int i = 0; i <= batteryArray.length - 1; i++) {
if (valueFromEntry >= batteryArray[i]) {
realChargeValue.setText((i * 5) + ""); // This is where the unit test fails
output = i*5;
}
if (valueFromEntry < batteryArray[batteryArray.length - 1]) {
realChargeValue.setText(R.string.hundredPercent);
output = 100;
}
}
return output;
}
public int-compareEnteredValue(int-batterySize,double-valueFromEntry,double-batteryArray[]){
int输出=0;
对于(int i=0;i=batteryArray[i]){
realChargeValue.setText((i*5)+;//这就是单元测试失败的地方
输出=i*5;
}
if(valueFromEntry
您可以进一步细分它。这样您的单元就不会从内部设置文本
public int compareEnteredValue(int batterySize, double valueFromEntry, double batteryArray[]) {
int output = 0;
for (int i = 0; i <= batteryArray.length - 1; i++) {
if (valueFromEntry >= batteryArray[i]) {
//realChargeValue.setText((i * 5) + ""); // This is where the unit test fails
output = i*5;
}
if (valueFromEntry < batteryArray[batteryArray.length - 1]) {
//realChargeValue.setText(R.string.hundredPercent);
output = 100;
}
}
return output;
}
然后,您就可以在不发布setText的情况下测试该单元。您可以进一步分解它。这样您的单元就不会从内部设置文本
public int compareEnteredValue(int batterySize, double valueFromEntry, double batteryArray[]) {
int output = 0;
for (int i = 0; i <= batteryArray.length - 1; i++) {
if (valueFromEntry >= batteryArray[i]) {
//realChargeValue.setText((i * 5) + ""); // This is where the unit test fails
output = i*5;
}
if (valueFromEntry < batteryArray[batteryArray.length - 1]) {
//realChargeValue.setText(R.string.hundredPercent);
output = 100;
}
}
return output;
}
然后,您就可以在不发布setText的情况下测试单元。添加到@doomsnight answer中,通常不需要对代码的每一行进行单元测试。但如果你有足够的热情去测试甚至达到那个水平,下面是你如何实现它的方法。我正在使用一些添加的界面来展示测试
public class TestableClass{
private UIElement realChargeValue;
public TestableClass(UIElement uiElem){
realChargeValue = uiElem;
}
public int compareEnteredValue(int batterySize, double valueFromEntry, double batteryArray[]) {
//Your method which needs to test realChargeValue
int output = 0;
for (int i = 0; i <= batteryArray.length - 1; i++) {
if (valueFromEntry >= batteryArray[i]) {
realChargeValue.setText((i * 5) + ""); // This is where the unit test fails
output = i*5;
}
if (valueFromEntry < batteryArray[batteryArray.length - 1]) {
realChargeValue.setText(R.string.hundredPercent);
output = 100;
}
}
return output;
}
}
public interface UIElement{
boolean setText();
}
公共类可测试类{
私有UIElement realChargeValue;
公共可测试类(UIElement uiElem){
realChargeValue=uiElem;
}
public int compareEnteredValue(int-batterySize,double-valueFromEntry,double-batteryArray[])){
//您需要测试realChargeValue的方法
int输出=0;
对于(int i=0;i=batteryArray[i]){
realChargeValue.setText((i*5)+;//这就是单元测试失败的地方
输出=i*5;
}
if(valueFromEntry
对于测试类,您可以使用以下命令:
public class Test{
@Test
public void verify_compareEnteredValue_sets_correct_text(){
ArgumentCaptor<String> argumentCaptor = ArgumentCaptor.forClass(String.class);
UIElement dummyUIElement = mock(UIElement.class);
doReturn(true).when(dummyUIElement).setText(argumentCaptor.capture());
new TestableClass(dummyUIElement).compareEnteredValue();
List<String> expectedValues = argumentCaptor.getAllValues();
//do all asserts here over expectedValues
}
}
公共类测试{
@试验
public void verify\u compareEnteredValue\u set\u correct\u text(){
ArgumentCaptor ArgumentCaptor=ArgumentCaptor.forClass(String.class);
UIElement dummyuelement=mock(UIElement.class);
doReturn(true).when(dummyuelement).setText(argumentCaptor.capture());
NewTestableClass(dummyUIElement).compareEnteredValue();
List expectedValues=argumentCaptor.getAllValues();
//此处的所有资产是否超过预期值
}
}
添加到@doomsnight answer中,通常不需要对代码的每一行进行单元测试。但如果你有足够的热情去测试甚至达到那个水平,下面是你如何实现它的方法。我正在使用一些添加的界面来展示测试
public class TestableClass{
private UIElement realChargeValue;
public TestableClass(UIElement uiElem){
realChargeValue = uiElem;
}
public int compareEnteredValue(int batterySize, double valueFromEntry, double batteryArray[]) {
//Your method which needs to test realChargeValue
int output = 0;
for (int i = 0; i <= batteryArray.length - 1; i++) {
if (valueFromEntry >= batteryArray[i]) {
realChargeValue.setText((i * 5) + ""); // This is where the unit test fails
output = i*5;
}
if (valueFromEntry < batteryArray[batteryArray.length - 1]) {
realChargeValue.setText(R.string.hundredPercent);
output = 100;
}
}
return output;
}
}
public interface UIElement{
boolean setText();
}
公共类可测试类{
私有UIElement realChargeValue;
公共可测试类(UIElement uiElem){
realChargeValue=uiElem;
}
public int compareEnteredValue(int-batterySize,double-valueFromEntry,double-batteryArray[])){
//您需要测试realChargeValue的方法
int输出=0;
对于(int i=0;i=batteryArray[i]){
realChargeValue.setText((i*5)+;//这就是单元测试失败的地方
输出=i*5;
}
if(valueFromEntry
对于测试类,您可以使用以下命令:
public class Test{
@Test
public void verify_compareEnteredValue_sets_correct_text(){
ArgumentCaptor<String> argumentCaptor = ArgumentCaptor.forClass(String.class);
UIElement dummyUIElement = mock(UIElement.class);
doReturn(true).when(dummyUIElement).setText(argumentCaptor.capture());
new TestableClass(dummyUIElement).compareEnteredValue();
List<String> expectedValues = argumentCaptor.getAllValues();
//do all asserts here over expectedValues
}
}
公共类测试{
@试验
public void verify\u compareEnteredValue\u set\u correct\u text(){
ArgumentCaptor ArgumentCaptor=ArgumentCaptor.forClass(String.class);
UIElement dummyuelement=mock(UIElement.class);
doReturn(true).when(dummyuelement).setText(argumentCaptor.capture());
NewTestableClass(dummyUIElement).compareEnteredValue();
List expectedValues=argumentCaptor.getAllValues();
//此处的所有资产是否超过预期值
}
}
是否尝试模拟TextView和method setText?是否尝试模拟TextView和method setText?我不知道为什么,但这不起作用。如果调用compareEnteredValue后尝试在侦听器中设置文本,则setOnFocusChangeListener()会调用compareEnteredValue方法。该值始终为100 EDIT:我已修复。必须设置返回输出=i*5;返回输出=100@WeSt我想说的是,你的循环有点奇怪,但不确定你想要达到什么。我想这就是单元测试的要点。它将识别返回值是错误的。我不知道为什么,但这不起作用。如果调用compareEnteredValue后尝试在侦听器中设置文本,则setOnFocusChangeListener()会调用compareEnteredValue方法。该值始终为100 EDIT:我已修复。必须设置返回输出=i*5;返回输出=100@WeSt我想说的是,你的循环有点奇怪,但不确定你想要达到什么。我想这就是单元测试的要点。它将识别返回值是错误的。感谢您的回答,末日骑士的回答很简单,并且完成了任务。但这对我将来也有帮助:)谢谢你的回答,末日骑士的回答很简单,而且很成功。但这对我将来也有帮助:)