GVKun编程网logo

Mockito Spy-调用构造函数之前的存根(调用构造函数的顺序)

14

如果您想了解MockitoSpy-调用构造函数之前的存根和调用构造函数的顺序的知识,那么本篇文章将是您的不二之选。我们将深入剖析MockitoSpy-调用构造函数之前的存根的各个方面,并为您解答调用构

如果您想了解Mockito Spy-调用构造函数之前的存根调用构造函数的顺序的知识,那么本篇文章将是您的不二之选。我们将深入剖析Mockito Spy-调用构造函数之前的存根的各个方面,并为您解答调用构造函数的顺序的疑在这篇文章中,我们将为您介绍Mockito Spy-调用构造函数之前的存根的相关知识,同时也会详细的解释调用构造函数的顺序的运用方法,并给出实际的案例分析,希望能帮助到您!

本文目录一览:

Mockito Spy-调用构造函数之前的存根(调用构造函数的顺序)

Mockito Spy-调用构造函数之前的存根(调用构造函数的顺序)

我试图监视一个对象,并且想在构造函数调用它之前对构造函数调用的方法进行存根。
我的课看起来像这样:

public class MyClass {    public MyClass() {         setup();    }    public void setup() {    }}

不能调用setup方法。好吧,我如何监视这种方法(以及存根设置,使其什么也不做)?
模拟方法可以很好地工作,但是我想进行单元测试MyClass,因此我将需要其他方法。


之所以需要对设置方法进行打桩以使其无能为力的原因:
我正在对Lego机器人(lejos)进行编程,并在设置中放入了一些代码,该代码需要该机器人能够工作。但是,当我在TinyVM(安装在机器人上的VM)之外调用它时,java崩溃了,因为尚未正确初始化VM(因为测试是在我的PC上运行的)。对于单元测试,设置并不重要。
我无法对类/方法设置调用进行存根处理,因为其中一些是公共静态最终变量。

答案1

小编典典

感谢您的建议,但这有点太复杂了。
最后,我通过扩展类并覆盖我的设置方法来模拟该方法。这样,默认构造函数将不会调用安装程序的实现,而是会调用覆盖的方法。
这是代码:

// src/author/MyClass.javapublic class MyClass {    public MyClass() {        setup();    }    protected void setup() {        throw new Exception("I hate unit testing !");    }    public boolean doesItWork() {        return true;    }}// test/author/MyClass.javapublic class MyClassTest {    private class MockedMyClass extends MyClass {        @Override        protected void setup() {        }    }    private MyClass instance;    @Before    public void setUp() { // Not to be confusing with `MyClass#setup()`!        instance = new MockedMyClass();    }    @Test    public void test_doesItWork() {        assertTrue(instance.doesItWork());    }}

如果您不希望MyTest的安装程序方法被测试以外的其他子类调用或覆盖(因为其他开发人员可能会通过使用安装程序方法将事情弄得很糟),只需将可见性更改为default即可,只有您的类才能呼叫设置。


如果有更简单的方法,请回答问题,因为我对解决方案不是100%满意。

angular – 如何确保在从类调用函数之前完成构造函数/ ngOnInit?

angular – 如何确保在从类调用函数之前完成构造函数/ ngOnInit?

我有一个类,初始化时从服务中检索数据并填充其中一个属性,即一个数组.这个类有一个函数可以对这个数组进行排序,过滤和返回.
当我实例化这个类的对象并调用这个函数时,我意识到它在构造函数和ngOnInit()函数完成之前被调用(可能是因为我使用来自Observables的异步内容,服务返回).在外部调用类的任何函数之前,如何保证构造函数和init已完全执行?

export class BaseChoice implements PickAppraiser,OnInit {
weight = 0;
options = new Array<PickQuality>();

constructor(private championService: ChampionService) {}

ngOnInit() {
    // Iterates through the list of champions adding them to the current object
    this.championService.getChampions()
        .subscribe(champions => {
            // Iterates through the list of champions adding them to the current object
            Object.keys(champions).map(key => this.options.push(new PickQuality(champions[key],0)))
        })
}

choose(n?: number): PickQuality[] {
    var sorted = this.options.sort((a,b) => a.score - b.score);
    return sorted;
}

}

我也尝试过这样的事情

choose(n?: number): PickQuality[] {
    // Iterates through the list of champions adding them to the current object
    this.championService.getChampions()
        .subscribe(champions => {
            // Iterates through the list of champions adding them to the current object
            Object.keys(champions).map(key => this.options.push(new PickQuality(champions[key],0)))
            this.reevaluate(this.options);

            var sorted = this.options.sort((a,b) => a.score - b.score);
            var chosen;
            if(n) chosen = sorted.slice(1,n);
            else chosen = sorted.slice(1,2);
            return chosen;
        });
}

我在choose()方法本身内运行异步请求,但它不允许我这样做,我假设因为返回变量不能保证存在.

解决方法

我想,你应该看看你是如何从根本上布置你的组件的.您可以利用observables将它们用作角度支持的方式,使用异步管道在模板中支持它.

我不确定你的组件的细节,但我会做这样的事情:

export class BaseChoice implements PickAppraiser,OnInit {
    weight = 0;
    options$: Observable<PickQuality>;
    champions$: Observable<Champion>;

    constructor(private championService: ChampionService) {}

    ngOnInit() {
        this.champions$= this
            .championService.getChampions();

        this.options$= this.champions$.map((champion,index) => {
          return new PickQuality(champion,0)))
      })
    }
}

在你的模板中,如果你在选项$| async中执行* ngFor =“let选项”,它将自动运行该流并给你结果,然后在你的choose()函数中,我假设是用户所采取的动作点击,你可以直接通过选项来做一些事情.

如果它比这更复杂,您可以将其映射到像clicksClicked $这样的点击流,并将这些点击映射到选项流中的正确选项.

要记住的是,您正在使用一系列操作设置这些observable,并且该管道每个Observer(订阅者)运行一次,这意味着每次使用|异步管道它订阅和运行整个事情.

花一些时间学习RxJS将为你的Angular 2开发带来巨大回报.

C – 构造函数调用构造函数

C – 构造函数调用构造函数

我不知道如何用它来表达它或它实际上被称为什么,但我知道在Objective-C中你可以有多个构造函数可以连续相互调用,原谅任何代码错误,我有一段时间没有这样做,但这个想法就在那里.

- (id)initWithTitle:(Nsstring *)_title;
- (id)initWithTitle:(Nsstring *)_title page:(Nsstring *)_page;

-----------------------------------

- (id)initWithTitle:(Nsstring *)_title {
    return [self initWithTitle:_title page:nil];
}

- (id)initWithTitle:(Nsstring *)_title page:(Nsstring *)_page {
    if(self = [super init]) {
        self.title = _title;
        self.page = _page;
    }
    return self;
}

我只是想知道c中是否有相同的内容;

解决方法

在C 11之前你不能这样做,但是从C 11开始你可以做到

class Foo  {
     int d;         
public:
    Foo  (int i) : d(i) {}
    Foo  () : Foo(42) {} //new to c++11
};

c# – 如何使用构造函数将XML反序列化到对象中,该构造函数需要XDocument?

c# – 如何使用构造函数将XML反序列化到对象中,该构造函数需要XDocument?

我有一个班:
public class MyClass
{
   public MyClass(){}
}

我希望能够使用XMLSeralizer直接在构造函数中对XDocument进行反序列化:

public class MyClass
{
   private XmlSerializer _s = new XmlSerializer(typeof(MyClass));

   public MyClass(){}
   public MyClass(XDocument xd)
   {
      this = (MyClass)_s.Deserialize(xd.CreateReader());
   }
}

除非我不允许在构造函数中分配给“this”.

这可能吗?

解决方法

不,不可能.序列化器在反序列化时创建对象.您已经创建了一个对象.而是提供一个从XDocument构造的静态方法.
public static MyClass FromXml (XDocument xd)
{
   XmlSerializer s = new XmlSerializer(typeof(MyClass));
   return (MyClass)s.Deserialize(xd.CreateReader());
}

c# – 当调用者需要特定的构造函数签名时使用构造函数注入

c# – 当调用者需要特定的构造函数签名时使用构造函数注入

我是.NET C#和DI的新手. autofac并且在我无法完全控制来电方时遇到问题以了解如何使用DI.

我有两个问题需要理解.

场景1:调用者需要一个默认构造函数(没有任何参数)

当我还想在构造类时注入一些服务接口时,如何处理这种情况?我在考虑构造函数链接,但这意味着我必须知道具体的类型,并且它围绕DI的思想工作. (至少我认为).

public class ServiceWorker
{
    IService _service;

    public ServiceWorker(IService service) 
    { 
        _service = service
    }
}

public class Caller
{
    // No way to change this. 
    var serviceWorker = new ServiceWorker();
}

Scneario 2:Caller期望一个特定的构造函数签名(例如

同样的问题在这里当调用者期望构造函数签名完全匹配时,如何注入其他依赖项?

我认为我理解这个概念的主要问题是,当不是所有的东西都由DI(来电者)构建时,我不会看到如何仅部分地进行DI

public class ServiceWorker
{
    IService _service;

    public ServiceWorker(string name,string id,IService service) 
    { 
        _service = service
    }
}

public class Caller
{
    // No way to change this. 
    var serviceWorker = new ServiceWorker(name,id);
}

我知道,这是非常基本的,但我相信在继续之前我需要首先理解这一点.还有替代品吗?

解决方法

正如Steven在他的评论中正确指出的那样,仅限于特定的构造函数签名是Constrained Construction反模式的一个实例.但有时,这可能超出您的控制范围.

一个例子是so-called ‘Provider pattern’,which isn’t a pattern at all.在这样的例子中,你可能必须按照第三方框架的规则进行游戏,因此你无能为力.这些框架应被视为对依赖注入不友好.

考虑OP中的场景2,因为场景1只是场景2的特例.如果必须提供具有某个构造函数的类,则可以创建具有所需构造函数签名的Facade.这使您可以避免使用依赖注入的精心设计的类来污染第三方框架强加的约束.它可能看起来像这样:

public class ServiceWorker
{
    IService _service;

    public ServiceWorker(string name,IService service) 
    { 
        _service = service
    }
}

public class ServiceWorkerFacade
{
    ServiceWorker imp;

    public ServiceWorkerFacade(string name,string id) 
    { 
        imp =
            new ServiceWorker(
                name,id,new FooService(
                    new BarService(),new BazService());
    }
}

public class Caller
{
    // No way to change this. 
    var serviceWorker = new ServiceWorkerFacade(name,id);
}

FooService实现了IService.为了让事情变得有趣,我假设FooService有自己的依赖关系,并且BarService和BazService满足了这些依赖关系.

正如Steven建议的那样,你可以(从必要性)考虑Facade的构造函数Composition Root.

如果您有任何机会影响相关框架的设计,您可以将开发人员指向my guidance on designing DI-friendly frameworks.

我们今天的关于Mockito Spy-调用构造函数之前的存根调用构造函数的顺序的分享就到这里,谢谢您的阅读,如果想了解更多关于angular – 如何确保在从类调用函数之前完成构造函数/ ngOnInit?、C – 构造函数调用构造函数、c# – 如何使用构造函数将XML反序列化到对象中,该构造函数需要XDocument?、c# – 当调用者需要特定的构造函数签名时使用构造函数注入的相关信息,可以在本站进行搜索。

本文标签: