我正在测试一个使用@Autowired注入服务的类:
public class RuleIdValidator implements ConstraintValidator<ValidRuleId, String> {
@Autowired
private RuleStore ruleStore;
// Some other methods
}
Run Code Online (Sandbox Code Playgroud)
但是如何在测试期间模拟ruleStore?我无法弄清楚如何将我的模拟RuleStore注入Spring并进入自动布线系统.
谢谢
我有以下情况:
class Worker {
public Integer somework() {
Integer k=0;
Helper h= new Helper();
h.change(k);
return k;
}
}
class Helper {
public void change(Integer k) {
//k = Some calcs
}
}
Run Code Online (Sandbox Code Playgroud)
我正在制作unitests Worker,显然我想要模拟Helper类,以便他的change方法总是将1放入k.
我的实际情况比较复杂,但这段代码代表了问题.感谢帮助.
我正在使用Mockito进行单元测试.我想知道是否可以像在Junit测试中一样发送参数化输入参数,
例如
@InjectMocks
MockClass mockClass = new MockClass();
@Test
public void mockTestMethod()
{
mockClass.testMethod(stringInput);
// here I want to pass a list of String inputs
// this is possible in Junit through Parameterized.class..
// wondering if its can be done in Mockito
}
Run Code Online (Sandbox Code Playgroud) 给定一个带有两种方法的java类(取自mockito):
OngoingStubbing<T> thenReturn(T value);
OngoingStubbing<T> thenReturn(T value, T... values);
Run Code Online (Sandbox Code Playgroud)
如果我从scala调用
....thenReturn("something")
Run Code Online (Sandbox Code Playgroud)
我收到一个错误:
Description Resource Path Location Type
ambiguous reference to overloaded definition, both method thenReturn in trait OngoingStubbing of type (x$1: java.lang.Object, x$2: <repeated...>[java.lang.Object])org.mockito.stubbing.OngoingStubbing[java.lang.Object] and method thenReturn in trait OngoingStubbing of type (x$1: java.lang.Object)org.mockito.stubbing.OngoingStubbing[java.lang.Object] match argument types (java.lang.String)
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚如何解决这个问题.
这是我的问题:
我有几个Web服务类来测试所有从通用服务继承他们的方法.我没有为每个编写单元测试,而是认为我可以通过功能区域(即三组测试方法,每组依赖于不同的底层DAO方法调用)来打破测试套件.
我打算做的是:
@Mock StateDAO mockedStateDao;
@Mock CountyDAO mockedCountyDao;
@Mock VisitorDAO mockedVisitorDao;
Run Code Online (Sandbox Code Playgroud)
然后打电话:
@InjectMocks CountyServiceImpl<County> countyService = new CountyServiceImpl<County>();
@InjectMocks StateServiceImpl<State> stateService = new StateServiceImpl<State>();
@InjectMocks VisitorServiceImpl<Visitor> visitorService = new VisitorServiceImpl<Visitor>();
Run Code Online (Sandbox Code Playgroud)
我怎样才能确定每个mockedDAO都会注入正确的服务?是否更容易自动装配所有三个(而不是使用@InjectMocks)?
我正在使用Spring,Hibernate和Mockito ......
when(candidateService.findById(1)).thenReturn(new Candidate());
Run Code Online (Sandbox Code Playgroud)
我想为任何整数扩展此行为(不一定是1)
如果我啰嗦
when(candidateService.findById( any(Integer.class) )).thenReturn(new Candidate());
Run Code Online (Sandbox Code Playgroud)
我有编译错误
CandidateService类型中的方法findById(Integer)不适用于参数(Matcher)
UPDATE
进口:
import static org.junit.Assert.assertEquals;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import java.util.ArrayList;
import java.util.HashSet;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
Run Code Online (Sandbox Code Playgroud) @Test(expectedExceptions=DataAccessException.class)
public void testUpdateSubModuleOrderDateExceptionCheck() {
//some code to initialize//
UserSubModuleDao userSubModuleDao = mock(UserSubModuleDao.class);
userModuleServiceImpl.setUserSubModuleDao(userSubModuleDao);
UserSubModule userSubModule=new UserSubModule();
UserSubModuleId userSubModuleId=new UserSubModuleId();
when(userSubModuleDao.findById(any(UserSubModuleId.class),eq(false))).thenThrow(DataAccessException.class);
userModuleServiceImpl.updateSubModuleOrder(data, moduleSysId, userId);
Run Code Online (Sandbox Code Playgroud)
我想为代码覆盖抛出Db异常.它的工作如果我给出预期的例外:Exception.class但不是DataAccessException.class
原始类中的方法如下:
public void updateSubModuleOrder(Long[] data, Long moduleSysId, Long userId) {
try {
for (int i = 0; i < data.length; i++) {
SubModule subModule=new SubModule();
subModule.setSubModuleId(data[i]);
UserSubModuleId userSubModuleId = new UserSubModuleId();
userSubModuleId.setSubModuleId(subModule);
userSubModuleId.setUserId(userId);
userSubModuleId.setUserModuleId(moduleSysId);
UserSubModule userSubmodule = new UserSubModule();
userSubmodule = userSubModuleDao.findById(userSubModuleId,
false);
catch (DataAccessException ewmsDataExp) {
LOGGER.error(
"Database Exception while updateSubModuleOrder …Run Code Online (Sandbox Code Playgroud) 我正在试图窥探一个Object,我想在构造函数调用之前存根一个由构造函数调用的方法.
我的班级看起来像这样:
public class MyClass {
public MyClass() {
setup();
}
public void setup() {
}
}
Run Code Online (Sandbox Code Playgroud)
不得调用安装方法.那么,我如何监视这个方法(和存根设置,以便它什么都不做)?
它可以很好地模拟方法,但我想进行单元测试MyClass,所以我需要其他方法.
之所以需要存根设置方法以便它什么都不做:
我正在编写一个乐高机器人(lejos)并且我在设置中放置了一些机器人需要工作的代码.但是,当我在TinyVM(安装在机器人上的VM)之外调用它时,java崩溃,因为VM尚未正确初始化(因为测试在我的PC上运行).对于单元测试,设置并不重要.
我不能存根类/方法设置调用,因为它们中的一些是公共静态最终变量.
我有一个API接口,我正在测试View涉及网络调用.
@Config(emulateSdk = 18)
public class SampleViewTest extends RobolectricTestBase {
ServiceApi apiMock;
@Inject
SampleView fixture;
@Override
public void setUp() {
super.setUp(); //injection is performed in super
apiMock = mock(ServiceApi.class);
fixture = new SampleView(activity);
fixture.setApi(apiMock);
}
@Test
public void testSampleViewCallback() {
when(apiMock.requestA()).thenReturn(Observable.from(new ResponseA());
when(apiMock.requestB()).thenReturn(Observable.from(new ResponseB());
AtomicReference<Object> testResult = new AtomicReference<>();
fixture.updateView(new Callback() {
@Override
public void onSuccess(Object result) {
testResult.set(result);
}
@Override
public void onError(Throwable error) {
throw new RuntimeException(error);
}
});
verify(apiMock, times(1)).requestA();
verify(apiMock, times(1)).requestB();
assertNotNull(testResult.get());
}
} …Run Code Online (Sandbox Code Playgroud) [序言:道歉,这里有很多代码,其中一些可能与这个问题无关,而一些理解问题所必需的代码可能会丢失; 请评论,我会相应地编辑问题.]
环境:Ubuntu 14.10 x86_64; Oracle JDK 1.8u25.单元测试库是TestNG,版本6.8.13; Mockito是版本1.10.17.
在我的GUI应用程序中,JavaFX称之为"控制器"的东西是非常被动的,因为这个"控制器"(我称之为"显示器")真正做的唯一事情就是发送事件.
现在,当收到需要GUI更新的事件时,它是另一个类,我称之为视图,它负责更新GUI.简而言之:
显示 - >演示者 - >视图 - >显示
我有两个单元测试:
所以,我在这方面已经被覆盖了(我可以改变显示器的优势,这就是我这样做的原因).
但现在我尝试测试"视图 - >显示"部分; 我是SOL.
作为说明,这里是视图类:
@NonFinalForTesting
public class JavafxTreeTabView
extends JavafxView<TreeTabPresenter, TreeTabDisplay>
implements TreeTabView
{
private final BackgroundTaskRunner taskRunner;
public JavafxTreeTabView(final BackgroundTaskRunner taskRunner)
throws IOException
{
super("/tabs/treeTab.fxml");
this.taskRunner = taskRunner;
}
JavafxTreeTabView(final BackgroundTaskRunner taskRunner,
final Node node, final TreeTabDisplay display)
{
super(node, display);
this.taskRunner = taskRunner;
}
@Override
public void loadTree(final ParseNode rootNode)
{ …Run Code Online (Sandbox Code Playgroud)