来自 Android 的测试基础,“您可以使用普通 JUnit 来测试不调用 Android API 的类,或者使用 Android 的 JUnit 扩展来测试 Android 组件。” 我相信这就是以下测试中的 spanString 为空的原因。有人可以确认这是原因吗?
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class SpanPainterTest {
@Test
public void appliesColorPerRange () {
SpannablesString spanString = new SpannableString("Aa Bb");
SpanPainter painter = new SpanPainter(new ForegroundColorSpan(10));
SpannableString coloredSpan =
painter.applyColor(spanString, new Pair<Integer, Integer>(0,1));
ForegroundColorSpan[] colorArr =
coloredSpan.getSpans(0,0, ForegroundColorSpan.class);
assertEquals(10, colorArr[0]);
}
}
这是 SpanPainter.java
public class SpanPainter {
ForegroundColorSpan color;
public SpanPainter (ForegroundColorSpan color) {
this.color = color;
}
public SpannableString applyColor(SpannableString span,
Pair<Integer, Integer> pair) {
span.setSpan(color,pair.first, pair.second, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
return span;
}
}
但它说“使用 Android 的 JUnit 扩展来测试 android 组件。所以我扩展了 AndroidTestCase,但 spanString 仍然等于 null。这让我认为没有单元测试可以使用 android api 对象而不将它设置为 null。是吗?对吗?(这是我的第二个问题。)这是作为 AndroidTestCase 的 SpanPainter 测试,结果是 spanString = null。
public class SpanPainterTest extends AndroidTestCase {
@SmallTest
public void testAppliesColorPerRange () {
SpannableString spanString = new SpannableString("Aa Bb");
SpanPainter painter = new SpanPainter(new ForegroundColorSpan(10));
...same as above.
assertEquals(9, colorArr[0]);
}
}
这是我的两个 JUnit 问题。如果我不扩展 AndroidTestCase,那么使用 android api 中的任何对象都会导致 null。如果我扩展 AndroidTestCase,来自 android api 的任何对象都会自动设置为 null。
最佳答案
我在使用 SpannableStringBuilder 时遇到了类似的问题。通过将我的测试移动到 androidTest 目录,我的问题得到了解决。 (感谢 this answer 的建议。)
这是在新位置进行的测试:
/**
* Instrumentation test, which will execute on an Android device.
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Test
public void myStringTest() throws Exception {
CharSequence unicode = "";
MyClass myClass = new MyClass(unicode);
CharSequence result = myClass.getUnicodeText(); // uses SpannableStringBuilder internally
CharSequence expected = unicode;
assertEquals(expected, result);
}
}
注意
你也可以试试mocking the Android classes ,但这对于像我这样的测试初学者来说要容易得多。我想缺点是仪器测试比单元测试运行得慢。
关于Android JUnit 测试不能调用任何 android api?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31973481/
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的:classAattr_reader:xdefinitialize(inner)@inner=innerenddefx;@inner.x;enddef==(other)@inner.x==other.xendenda=A.new(o)#oisjustanyobjectthatallowso.xb=A.new(o)h={a=>5}ph[a]#5ph[b]#nil,shouldbe5ph[o]#nil,shouldbe5我试过==、===、eq?并散列所有无济于事。
我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere
Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/
我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test
我试图在索引页中创建一个超链接,但它没有显示,也没有给出任何错误。这是我的index.html.erb代码。ListingarticlesTitleTextssss我检查了我的路线,我认为它们也没有问题。PrefixVerbURIPatternController#Actionwelcome_indexGET/welcome/index(.:format)welcome#indexarticlesGET/articles(.:format)articles#indexPOST/articles(.:format)articles#createnew_articleGET/article
我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r
我在app/helpers/sessions_helper.rb中有一个帮助程序文件,其中包含一个方法my_preference,它返回当前登录用户的首选项。我想在集成测试中访问该方法。例如,这样我就可以在测试中使用getuser_path(my_preference)。在其他帖子中,我读到这可以通过在测试文件中包含requiresessions_helper来实现,但我仍然收到错误NameError:undefinedlocalvariableormethod'my_preference'.我做错了什么?require'test_helper'require'sessions_hel